Come eseguire manualmente una discesa di DataGridViewComboBoxColumn?

Ho un DataGridView con un DataGridViewComboBoxColumn nella mia applicazione WinForms. Devo abbassare (aprire) manualmente DataGridViewComboBoxColumn, diciamo dopo aver fatto clic su un pulsante.

Il motivo per cui ho bisogno di questo è che ho impostato SelectionMode su FullRowSelect e ho bisogno di cliccare 2-3 volte per aprire la casella combinata. Voglio fare clic sulla cella della casella combinata e dovrebbe scendere immediatamente. Voglio farlo con l’evento CellClick, o c’è un altro modo?

Sto cercando su Google e VS help, ma non ho ancora trovato alcuna informazione.

Qualcuno può aiutare per favore?

So che questa non può essere la soluzione ideale ma crea una casella combinata con un clic che funziona all’interno della cella.

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 

dove “ddl” è la cella combinata che ho aggiunto nel gridview.

Grazie ThisMat, la tua soluzione funziona perfettamente.

Il mio codice in 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; } 

Sono stato in grado di avvicinarmi a ciò che stai cercando impostando

 DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter 

Finché non viene mostrato nessun altro dropdown della cella, dovrebbe visualizzare immediatamente il menu a discesa della cella selezionata.

Continuerò a pensare e aggiornare se qualcosa viene fuori.

Grazie per la versione C #. Ecco il mio contributo alla ricerca per nomi di 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; } } 

Stavo cercando una risposta anche a questo. Ho finito per scrivere un sub generico che poteva essere chiamato da qualsiasi DataGridView dato che avevo molto nelle mie app e volevo che tutti si comportassero allo stesso modo. Questo ha funzionato bene per me, quindi ho voluto condividerlo con chiunque altro si è imbattuto in questo post.

Nell’evento MouseClick per DGV aggiungo il codice

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

Che chiama il seguente sub che memorizzo in un modulo condiviso

 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(eX, eY) 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 

Non ho mai riscontrato errori, includo solo il codice Try..Catch per qualche raro caso a cui non possa pensare che possa generare un’eccezione. Non volevo che l’utente fosse disturbato dai messaggi di errore per questo scenario. Se il sottotitolo fallisce, allora molto probabilmente il DGV si comporterà come fa normalmente.

Sono stato in grado di triggersre la casella combinata e rilasciarlo utilizzando un singolo clic del mouse impostando la proprietà EditMode di DataGridView su EditOnEnter e creando l’ evento EditingControlShowing e aggiunto il codice per visualizzare la casella combinata in questo evento. Ecco il codice di esempio –

 //to get the correct cell get value of row and column indexs of the cell ColIndex = 1; RowIndex = 1; DataGridViewComboBoxCell ComboBoxCell = new DataGridViewComboBoxCell(); ComboBoxCell.Items.AddRange("XYZ", "ABC", "PQR"); ComboBoxCell.Value = "XYZ"; datagridview1[ColIndex, RowIndex] = ComboBoxCell; 

Dal codice precedente DataGirdCell nella posizione (1,1) verrà convertito in un “DataGridViewComboBoxCell” e la casella combinata verrà visualizzata nella cella.

Potrebbe essere ansible che per selezionare la casella combinata siano necessari più clic del mouse. Per triggersre la casella combinata con un clic, sono necessari i seguenti passaggi:

  1. Imposta la proprietà ReadOnly della cella della casella combinata su false
  2. Impostare la proprietà EditMode di DataGridView su EditOnEnter
  3. Crea un evento EditingControlShowing e aggiungi il codice per visualizzare la casella combinata

Ecco il codice di esempio per visualizzare la casella combinata e triggersrla con un solo clic:

 private void datagridview1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { ComboBox ctrl = e.Control as ComboBox; ctrl.Enter -= new EventHandler(ctrl_Enter); ctrl.Enter += new EventHandler(ctrl_Enter); } void ctrl_Enter(object sender, EventArgs e) { (sender as ComboBox).DroppedDown = true; } 

Per maggiori dettagli si prega di controllare – http://newapputil.blogspot.in/2015/08/add-combo-box-in-cell-of-datagridview.html

A proposito: ecco il codice di nvivekgoyal dal riferimento nella sua risposta :

 private void datagridview1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { ComboBox ctrl = e.Control as ComboBox; ctrl.Enter -= new EventHandler(ctrl_Enter); ctrl.Enter += new EventHandler(ctrl_Enter); } void ctrl_Enter(object sender, EventArgs e) { (sender as ComboBox).DroppedDown = true; }