如何在第一次单击时激活combobox(Datagridview)

在winforms中,您需要单击combobox两次以正确激活它 – 第一次聚焦它,第二次实际获取下拉列表。

如何更改此行为以便在第一次单击时激活?

这适用于DATAGRIDVIEWcombobox。

我意识到这是一个老问题,但我想我会向那些可能需要能够做到这一点的人提供我的解决方案。

虽然我找不到任何答案来做到这一点……我确实找到了帮助我的另一个问题的答案 。

这是我的解决方案:

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; } } 

上面的代码必须绑定到datagridview的CellEnter事件中。

我希望这有帮助!

编辑:添加列索引检查以防止在选择整行时崩溃。

谢谢, Up Up Night进行上述编辑

edit2:现在代码绑定到CellEnter而不是CellClick事件。

谢谢, HaraldDutch为上述编辑

在DataGridView上设置以下内容:

 EditMode = EditOnEnter 

这可能是最简单的解决方案,并且当问到这个问题时,已经为SO上的许多用户提供了解决方法。


编辑:

按此处执行以下操作:

设置Editmode:

 EditMode = EditOnKeystrokeOrF2 

修改datagridview上的EditingControlShowing事件:

 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; } 

这将为您提供所需的结果。 如果不这样做,请告诉我。

如果将整个网格设置为EditOnEnter,则当您在文本列上时,可以获得一些非常时髦的活动。 这是我的解决方案,应该是自我解释的。 如果您不知道列名,可以在mousemove上检查单元格类型。

 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 

我只将datagridviewEditMode属性更改为EditOnEnter ,它的工作正常。

 EditMode = EditOnEnter 

将combobox的DropDownStyle属性设置为DropDownList …