2008-10-27 40 views
18

Tengo un DataGridView con una DataGridViewComboBoxColumn en mi aplicación WinForms. Necesito desplegar (abrir) esta DataGridViewComboBoxColumn manualmente, digamos después de hacer clic en un botón.¿Cómo se despliega manualmente un DataGridViewComboBoxColumn?

La razón por la que necesito esto es porque he configurado SelectionMode en FullRowSelect y necesito hacer clic 2-3 veces para abrir el cuadro combinado. Quiero hacer clic en la celda del combobox y debería desplegarse inmediatamente. Quiero hacer esto con el evento CellClick, o ¿hay alguna otra manera?

Estoy buscando en Google y en la ayuda de VS, pero todavía no he encontrado ninguna información.

¿Alguien puede ayudar, por favor?

Respuesta

22

Sé que esta no puede ser la solución ideal, pero crea un cuadro combinado con un solo clic que funciona dentro de la celda.

Private Sub cell_Click(ByVal sender As System.Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick 
     DataGridView1.BeginEdit(True) 
     If DataGridView1.Rows(e.RowIndex).Cells(ddl.Name).Selected = True Then 
      DirectCast(DataGridView1.EditingControl, DataGridViewComboBoxEditingControl).DroppedDown = True 
     End If 
    End Sub 

donde "ddl" es la celda combobox que agregué en la vista de cuadrícula.

10

he sido capaz de acercarse a lo que estás buscando estableciendo

DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter 

Mientras se muestra desplegable de ninguna otra célula que debe mostrar desplegable de la celda seleccionada inmediatamente.

Voy a seguir pensando y actualizar si surge algo.

15

Gracias ThisMat, su solución funciona perfectamente.

Mi código en C#:

private void dataGridViewWeighings_CellClick(object sender, DataGridViewCellEventArgs e) { 
    if (e.RowIndex < 0) { 
     return;  // Header 
    } 
    if (e.ColumnIndex != 5) { 
     return;  // Filter out other columns 
    } 

    dataGridViewWeighings.BeginEdit(true); 
    ComboBox comboBox = (ComboBox)dataGridViewWeighings.EditingControl; 
    comboBox.DroppedDown = true; 
} 
+0

Me alegro de que tengo trabajo! – thismat

+0

Esto fue increíblemente útil. – BrianH

2

Gracias por la versión de C#. Aquí está mi contribución a la búsqueda por nombres de columna combinados:

private void dgv_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    string Weekdays = @"MondayTuesdayWednesdayThursdayFridaySaturdaySunday"; 
    if (Weekdays.IndexOf(dgv.Columns[e.ColumnIndex].Name) != -1) 
    { 
     dgv.BeginEdit(true); 
     ComboBox comboBox = (ComboBox)dgv.EditingControl; 
     comboBox.DroppedDown = true; 
    } 
} 
1

Estaba buscando una respuesta a esto también. Terminé escribiendo un sub genérico que podría llamarse desde cualquier DataGridView, ya que tenía muchas aplicaciones y quería que todas se comportaran de la misma manera. Esto funcionó bien para mí, así que quise compartirlo con cualquier persona que tropezó con esta publicación.

En el caso MouseClick para la DGV agrego el código

Private Sub SomeGrid_MouseClick(sender As Object, e As MouseEventArgs) Handles SomeGrid.MouseClick 
    DGV_MouseClick(sender, e) 
End Sub 

que llama a los siguientes sub que almaceno en un módulo compartido

Public Sub DGV_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    Try 
     Dim dgv As DataGridView = sender 
     Dim h As DataGridView.HitTestInfo = dgv.HitTest(e.X, e.Y) 
     If h.RowIndex > -1 AndAlso h.ColumnIndex > -1 AndAlso dgv.Columns(h.ColumnIndex).CellType Is GetType(DataGridViewComboBoxCell) Then 
      Dim cell As DataGridViewComboBoxCell = dgv.Rows(h.RowIndex).Cells(h.ColumnIndex) 
      If Not dgv.CurrentCell Is cell Then dgv.CurrentCell = cell 
      If Not dgv.IsCurrentCellInEditMode Then 
       dgv.BeginEdit(True) 
       CType(dgv.EditingControl, ComboBox).DroppedDown = True 
      End If 
     End If 
    Catch ex As Exception 
    End Try 
End Sub 

Nunca alcancé los errores, sólo incluyo el Try ... código de captura de alguna rara instancia en la que no podía pensar que arrojara una excepción. No quería que al usuario le molestaran los mensajes de error para este escenario. Si el submarinista falla, lo más probable es que el DGV simplemente se comporte como siempre.

Cuestiones relacionadas