web-dev-qa-db-fra.com

Comment activer la zone de liste déroulante au premier clic (Datagridview)

Dans Winforms, vous devez cliquer deux fois sur la zone de liste déroulante pour l'activer correctement - la première fois pour la concentrer, la deuxième fois pour obtenir la liste déroulante.

Comment changer ce comportement pour qu'il s'active dès le premier clic?

Il s'agit de la zone de liste déroulante DATAGRIDVIEW.

33
l46kok

Je me rends compte que c'est une vieille question, mais j'ai pensé que je donnerais ma solution à tous ceux qui pourraient avoir besoin de le faire.

Même si je n'ai trouvé aucune réponse pour faire exactement cela ... J'ai trouvé une réponse à une question différente qui m'a aidé.

Voici ma solution:

private void datagridview_CellEnter(object sender, DataGridViewCellEventArgs e)
    {
        bool validClick = (e.RowIndex != -1 && e.ColumnIndex != -1); //Make sure the clicked row/column is valid.
        var datagridview = sender as DataGridView;

        // Check to make sure the cell clicked is the cell containing the combobox 
        if(datagridview.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn && validClick)
        {
            datagridview.BeginEdit(true);
            ((ComboBox)datagridview.EditingControl).DroppedDown = true;
        }
    }

Le code ci-dessus doit être lié à l'événement CellEnter du datagridview.

J'espère que ça aide!

edit: Ajout d'une vérification d'index de colonne pour éviter de planter lorsque la ligne entière est sélectionnée.

Merci, p All Night pour la modification ci-dessus

edit2: Le code doit maintenant être lié à CellEnter plutôt qu'à l'événement CellClick.

Merci, HaraldDutch pour la modification ci-dessus

53
Jeff Click

Définissez les éléments suivants sur votre DataGridView:

EditMode = EditOnEnter

C'est probablement la solution la plus simple et a été la solution de contournement pour de nombreux utilisateurs ici sur SO lorsque cette question est posée.


MODIFIER:

Par ici procédez comme suit:

Définissez le mode d'édition:

EditMode = EditOnKeystrokeOrF2

Modifiez l'événement EditingControlShowing sur le datagridview:

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    ComboBox ctl = e.Control as ComboBox;
    ctl.Enter -= new EventHandler(ctl_Enter);
    ctl.Enter += new EventHandler(ctl_Enter);

}

void ctl_Enter(object sender, EventArgs e)
{
    (sender as ComboBox).DroppedDown = true;
}

Cela vous permettra d'obtenir les résultats souhaités. Faites-moi savoir si cela ne le fait pas.

27
KreepN

J'ai changé uniquement la propriété EditMode de datagridview en EditOnEnter et cela fonctionne parfaitement.

EditMode  = EditOnEnter
2
Yudit

Si vous définissez la grille entière sur EditOnEnter, vous pouvez obtenir une activité assez funky lorsque vous êtes sur une colonne de texte. Voici ma solution, qui devrait être explicite. Si vous ne connaissiez pas les noms des colonnes, vous pouvez simplement vérifier le type de cellule lors du déplacement de la souris.

Private Sub GridView_CellMouseMove(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles GridView.CellMouseMove
    Select Case GridView.Columns(e.ColumnIndex).Name
        Case "Ad_Edit", "Size_Caption", "Demo_Code"
            GridView.EditMode = DataGridViewEditMode.EditOnEnter
        Case Else
            GridView.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
    End Select
End Sub
1
jefferp

Définissez la propriété DropDownStyle de votre zone de liste déroulante sur DropDownList ...

0
Abdul Majid