在 winforms 中,您需要单击组合框两次才能正确激活它 - 第一次将其聚焦,第二次才能实际获取下拉列表。
如何更改此行为,使其在第一次单击时激活?
这是用于 DATAGRIDVIEW 组合框。
我意识到这是一个老问题,但我想我会将我的解决方案提供给可能需要能够做到这一点的任何人。
虽然我找不到任何答案来做到这一点...我确实找到了一个对我有帮助的不同问题的答案。
这是我的解决方案:
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;
}
}
private void datagridview_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
datagridview.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
上面的代码必须绑定到datagridview的CellEnter事件中。
我希望这有帮助!
编辑:添加了列索引检查,以防止选择整行时崩溃。
谢谢,彻夜不眠进行上述编辑
edit2: 代码现在将与 CellEnter 而不是 CellClick 事件绑定。
感谢HaraldDutch进行上述编辑
edit3: 任何更改都将立即提交,这将使您无需单击另一个单元格来更新当前组合框单元格。
在 DataGridView 上设置以下内容:
EditMode = EditOnEnter
这可能是最简单的解决方案,并且是许多用户在提出此问题时的解决方法。
编辑:
根据此处执行以下操作:
设置编辑模式:
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;
}
这将为您带来您想要的结果。如果这不起作用,请告诉我。
我仅将
EditMode
的 datagridview
属性更改为 EditOnEnter
,并且它工作正常。
EditMode = EditOnEnter
如果将整个网格设置为 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
将组合框的 DropDownStyle 属性设置为 DropDownList...
也许旧了..但请确保将
ReadOnly
属性设置为 false
,否则单元格将不会进入编辑模式,因此 EditingControl
返回 null 并且转换 DroppedDown = true
将转换 NullReferencException
。
我在我的数据网格视图中使用这个解决方案。
Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
If DataGridView1(e.ColumnIndex, e.RowIndex).EditType = GetType(DataGridViewComboBoxEditingControl) Then
DataGridView1.BeginEdit(True)
Dim comboboxCell As DataGridViewComboBoxEditingControl = DataGridView1.EditingControl
If comboboxCell Is Nothing Then Return
comboboxCell.DroppedDown = True
End If
End Sub