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:
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:
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
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:
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!
@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.
...
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