No encuentro evento de DataGridViewComboBoxCell

Iniciado por FJDA, 31 Marzo 2017, 20:06 PM

0 Miembros y 1 Visitante están viendo este tema.

FJDA

hola

He creado un DataGridView dentro da algunas celdas he añadido combox (DataGridViewComboBoxCell). El caso es que necesito que al seleccionar un elemento del combo, automáticamente reciba el evento y usar el valor seleccionado para buscarlo en una tabla DataTable para luego obtener un valor:

Código (vbnet) [Seleccionar]

    Public Sub GetValue(ByVal numCol As Integer, ByVal numRow As Integer)
        If numCol = 0 Then
            For Each N As DataRow In dt.Rows
                Dim Item As String = CStr(N.Item(1).ToString.Replace("*", ""))
                Try
                    If DataGridView1.Item(numCol, numRow).Value.ToString.Contains(Item) Then
                        DataGridView1.Item(5, 0).Value = N.Item(10)
                    End If
                Catch ex As Exception

                End Try

            Next
        End If
    End Sub


Tengo una tabla DataTable llamada dt y con el este código la idea es añadirla en un evento el cual me devuelve la columna y la fila donde  he seleccionado el elemento del combo y llamo al procedimiento getValue:
Código (vbnet) [Seleccionar]
GetValue(e.ColumnIndex, e.RowIndex )

Pero no consigo encontrar ningún evento que ejecute el procedimiento instantáneamente nada más hacer clic en un elemento del combo.

Solo consigo que devuelva el valor cuando hago clic en otra ceda del DataGridView y abandono el combo.

espero me puedan ayudar  :)


Gracias

Eleкtro

#1
Hola.

Si no te he entendido mal quieres ser capaz de controlar el evento ComboBox.SelectedIndexChanged de los ComboBoxes que existan en las celdas de tu DataGridView, y obtener el número de columna y fila de la celda cada que que dicho evento se dispare.

Bien, pues para ello puedes controlar el evento DataGridView.EditingControlShowing de la siguiente manera. Te muestro un ejemplo que puedas adaptar a tus necesidades:

Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown

       Dim column As New DataGridViewComboBoxColumn()
       With column
           .DataSource = "qwerty".ToArray()
           .ValueType = GetType(Char)
       End With

       Me.DataGridView1.Columns.Add(column)

   End Sub

   Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) _
   Handles DataGridView1.EditingControlShowing

       Dim cb As ComboBox = DirectCast(e.Control, ComboBox)
       ' Eliminar un posible controlador de evento que haya sido agregado anteriormente, para evitar agregar varios.
       RemoveHandler cb.SelectedIndexChanged, AddressOf Me.ComboBox_SelectedIndexChanged
       ' Aasociar el nuevo controlador.
       AddHandler cb.SelectedIndexChanged, AddressOf Me.ComboBox_SelectedIndexChanged

   End Sub

   Private Sub ComboBox_SelectedIndexChanged(sender As Object, e As EventArgs)

       Dim cb As ComboBox = DirectCast(sender, ComboBox)

       If (cb.SelectedIndex <> -1) Then
           Dim dgv As DataGridView = DirectCast(cb.Parent.Parent, DataGridView)
           Dim cell As DataGridViewCell = dgv.CurrentCell
           Dim colIndex As Integer = cell.ColumnIndex
           Dim rowIndex As Integer = cell.RowIndex

           Dim sb As New StringBuilder()
           sb.AppendLine(String.Format("Selected index changed: {0}", cb.SelectedIndex))
           sb.AppendLine(String.Format("Column Index: {0}, Row Index: {1}", colIndex, rowIndex))
           MessageBox.Show(sb.ToString())
       End If

   End Sub

End Class


¡Saludos!








FJDA

#2
@Elektro sois un genio muchas gracias. ;-)

Funciona perfecto.

Ahora tengo que usar SelectedItem debido a que el DataGridView no recoge el elemento seleccionado hasta haber abandonado la celda o haber pulsado Enter. Ese era el problema. Ahora va perfecto.

Código (vbnet) [Seleccionar]

...
   Private Sub ComboBox_SelectedIndexChanged(sender As Object, e As EventArgs)

       Dim cb As ComboBox = DirectCast(sender, ComboBox)

       If (cb.SelectedIndex <> -1) Then
           Dim dgv As DataGridView = DirectCast(cb.Parent.Parent, DataGridView)
           Dim cell As DataGridViewCell = dgv.CurrentCell
           Dim colIndex As Integer = cell.ColumnIndex
           Dim rowIndex As Integer = cell.RowIndex

           'Dim sb As New System.Text.StringBuilder()
           'sb.AppendLine(String.Format("Selected index changed: {0}", cb.SelectedIndex))
           'sb.AppendLine(String.Format("Column Index: {0}, Row Index: {1}", colIndex, rowIndex))
           'MessageBox.Show(sb.ToString())

           MessageBox.Show(CStr(DataGridView1.Item(colIndex, rowIndex).Value))
           MessageBox.Show(CStr(cb.SelectedItem))
       End If

   End Sub


El primer mensaje  aparece vacío, mientras que el segundo devuelve valor.

Saludos