在WinForms中,你需要点击两次Combobox才能正确激活它 - 第一次是为了聚焦它,第二次才可以弹出下拉列表。
我该如何更改此行为以便在第一次单击时就激活它?
这是针对DATAGRIDVIEW Combobox的。
我该如何更改此行为以便在第一次单击时就激活它?
这是针对DATAGRIDVIEW Combobox的。
我知道这是一个老问题,但我想给那些可能需要做到这一点的人提供我的解决方案。
虽然我找不到确切的答案来做到这一点......但我找到了对于另一个问题的回答,这个回答帮助了我。
这是我的解决方案:
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事件中。
希望这可以帮到您!
编辑:增加了列索引检查,以防止在选择整行时崩溃。
感谢Up All Night进行上述编辑。
编辑2:现在将代码绑定到CellEnter而不是CellClick事件。
感谢HaraldDutch进行上述编辑。
编辑3:任何更改都将立即提交,这将使您无需点击另一个单元格来更新当前的组合框单元格。
gridView.EditMode = DataGridViewEditMode.EditOnEnter
仅在单击箭头时打开下拉菜单。 - ceztko在你的DataGridView上设置以下内容:
EditMode = EditOnEnter
这可能是最简单的解决方案,对于许多在SO上提出此问题的用户,这已经是一个解决方法。
编辑:
根据这里所述,进行以下操作:
设置编辑模式:
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;
}
这将帮助您获得所需的结果。如果不能实现,请告诉我。
我只改变了datagridview
的EditMode
属性为EditOnEnter
,现在它可以完美地工作。
EditMode = EditOnEnter
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
也许有点老旧..但一定要将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