2008-10-27 5 views
18

J'ai un DataGridView avec un DataGridViewComboBoxColumn dans mon application WinForms. J'ai besoin de dérouler (ouvrir) cette DataGridViewComboBoxColumn manuellement, disons après avoir cliqué sur un bouton.Comment faire pour dérouler manuellement un DataGridViewComboBoxColumn?

La raison pour laquelle j'ai besoin de ceci est que j'ai défini SelectionMode sur FullRowSelect et j'ai besoin de cliquer 2-3 fois pour ouvrir la liste déroulante. Je veux cliquer sur la cellule de liste déroulante et il devrait tomber immédiatement. Je veux le faire avec l'événement CellClick, ou y a-t-il un autre moyen?

Je cherche dans Google et l'aide de VS, mais je n'ai pas encore trouvé d'information.

Quelqu'un peut-il vous aider s'il vous plaît?

Répondre

22

Je sais que cela ne peut pas être la solution idéale, mais cela crée une zone de liste déroulante à un seul clic qui fonctionne dans la cellule.

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 

où "ddl" est la cellule combobox j'ai ajouté dans le gridview.

10

Je suis en mesure de se rapprocher de ce que vous cherchez en mettant

DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter 

Tant que le menu déroulant de aucune autre cellule est affichée, il doit afficher immédiatement le menu déroulant de la cellule sélectionnée.

Je continuerai à penser et à mettre à jour si quelque chose se présente.

15

Merci ThisMat, votre solution fonctionne parfaitement.

Mon code 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

Je suis heureux que vous avez été faire fonctionner! – thismat

+0

C'était incroyablement utile. – BrianH

2

Merci pour la version C#. Voici ma contribution à la recherche par des noms de colonne combo:

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

Je cherchais une réponse à cela aussi. J'ai fini par écrire un sous-répertoire générique qui pouvait être appelé à partir de n'importe quel DataGridView puisque j'avais beaucoup dans mes applications et je voulais que tous se comportent de la même manière. Cela a bien fonctionné pour moi, alors je voulais le partager avec quelqu'un d'autre qui a trébuché sur ce post.

En cas MouseClick pour le DGV j'ajouter le code

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

qui appelle les sous que je stocke dans un module partagé

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 

Je ne pris aucune erreur, j'inclure seulement le code Try..Catch pour une instance rare je ne pouvais pas penser à cela pourrait jeter une exception. Je ne voulais pas que l'utilisateur soit dérangé par des messages d'erreur pour ce scénario. Si le sous-marin échoue, il est fort probable que le DGV se comportera comme il le fait normalement de toute façon.

Questions connexes