Título: No encuentro evento de DataGridViewComboBoxCell
Publicado por: FJDA en 31 Marzo 2017, 20:06 pm
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
Título: Re: No encuentro evento de DataGridViewComboBoxCell
Publicado por: Eleкtro en 1 Abril 2017, 01:22 am
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!
Título: Re: No encuentro evento de DataGridViewComboBoxCell
Publicado por: FJDA en 1 Abril 2017, 14:17 pm
@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
|