winforms 如何在第一次单击时激活组合框(Datagridview)

vxf3dgd4  于 2023-10-23  发布在  其他
关注(0)|答案(7)|浏览(127)

在winforms中,您需要单击组合框两次才能正确激活它-第一次是为了聚焦它,第二次是为了实际获取列表。
如何更改此行为,使其在第一次单击时激活?
这是用于DATAGRIDVIEW组合框的。

gcmastyq

gcmastyq1#

我知道这是一个老问题,但我想我会给我的解决方案给予给任何人在那里可能需要能够做到这一点。
当我找不到答案的时候...我确实找到了一个answer到一个不同的问题,帮助我。
这是我的解决方案:

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的编辑

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

谢谢HaraldDutch的编辑

**edit 3:**任何更改都将立即提交,这将保存您在另一个单元格中单击以更新当前组合框单元格。

xdnvmnnf

xdnvmnnf2#

在DataGridView上设置以下内容:

EditMode = EditOnEnter

这可能是最简单的解决方案,也是SO上许多用户在被问到这个问题时的解决方法。

编辑:

按照here执行以下操作:

设置编辑模式:

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

这会让你得到你想要的结果。如果不行就告诉我。

o75abkj4

o75abkj43#

我只将datagridviewEditMode属性更改为EditOnEnter,它工作得很好。

EditMode  = EditOnEnter
uqzxnwby

uqzxnwby4#

如果将整个网格设置为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
x6h2sr28

x6h2sr285#

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

5kgi1eie

5kgi1eie6#

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

uplii1fm

uplii1fm7#

我在我的datagridviews中使用这个解决方案。

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

相关问题