40

在winforms中,你需要点击组合框两次才能正确激活它——第一次聚焦它,第二次真正得到下拉列表。

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

这适用于 DATAGRIDVIEW 组合框。

4

6 回答 6

63

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

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

这是我的解决方案:

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:任何更改都将立即提交,这将使您无需单击另一个单元格以更新当前的组合框单元格。

于 2014-10-23T14:38:11.530 回答
30

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

这会给你你想要的结果。让我知道如果那不这样做。

于 2012-10-22T05:45:23.953 回答
5

我只改变了to的EditMode属性,它工作得很好。datagridviewEditOnEnter

EditMode  = EditOnEnter
于 2017-12-06T07:05:03.260 回答
1

如果将整个网格设置为 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
于 2013-03-17T18:59:29.077 回答
0

将组合框的 DropDownStyle 属性设置为 DropDownList...

于 2012-10-22T05:20:17.620 回答
0

也许旧.. 但请确保将ReadOnly属性设置为false,否则单元格将不会进入编辑模式,因此EditingControl返回 null 并且强制转换DroppedDown = true将转换为NullReferencException.

于 2020-06-24T10:16:04.417 回答