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

44
在WinForms中,你需要点击两次Combobox才能正确激活它 - 第一次是为了聚焦它,第二次才可以弹出下拉列表。
我该如何更改此行为以便在第一次单击时就激活它?
这是针对DATAGRIDVIEW Combobox的。

如果您直接点击下拉箭头,它会被激活,对吗? - Rockstart
@Rockstart 不,必须先聚焦,然后才能在第二次尝试时激活它。 - TtT23
点击这个链接,它会解决你的问题。 - andy
7个回答

69

我知道这是一个老问题,但我想给那些可能需要做到这一点的人提供我的解决方案。

虽然我找不到确切的答案来做到这一点......但我找到了对于另一个问题的回答,这个回答帮助了我。

这是我的解决方案:

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


6
这非常有帮助,我认为这是获得它的正确方法。gridView.EditMode = DataGridViewEditMode.EditOnEnter 仅在单击箭头时打开下拉菜单。 - ceztko
1
我在多个场合遇到了这个问题,结果发现这是正确的答案(对于大多数用户而言也可能是唯一明智的答案)。对于其他遇到此问题的人,请直接将此答案与此处最受欢迎的答案进行比较,你一定会看到很大的差异。 - TtT23
3
若您使用键盘导航单元格,则此方法无效。请改用事件“CellEnter”而非单元格点击。 - Harald Coppoolse
@HaraldDutch 谢谢!我会调整我的回答。 - Jeff Click
嘿,伙计!我一直认为 Windows Forms 控件真的很麻烦,我在想为什么要点击X次才能显示我的下拉菜单。 - Radityo Ardi

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

这将帮助您获得所需的结果。如果不能实现,请告诉我。


这是我所做的。仍需要用户先聚焦控件,然后才能激活下拉列表。 - TtT23
它应该在第一次单击时激活此更改。你的情况是这样吗?当设置调整为以上内容时,它似乎会将焦点集中并弹出下拉菜单。 - KreepN
2
如果您点击箭头,它会这样做。我希望当整个单元格被点击时(即:文本部分),出现这种行为。 - TtT23
@l46kok 我认为你可能还有其他的问题。请创建一个新的WinForms应用程序,添加1个未绑定的ComboBox列并尝试。你会发现第二个可以正常工作。 - KreepN

5

我只改变了datagridviewEditMode属性为EditOnEnter,现在它可以完美地工作。

EditMode  = EditOnEnter

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

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

这是我所做的。如果组合框一开始没有焦点,仍需要用户点击两次。 - TtT23
@l46kok,下拉框是否与任何事件相关联? - andy
@Anandkumar 不是的。只是普通的组合框,上述属性已更改。编辑:天哪,我忘了提到这是为DGV的组合框。抱歉。 - TtT23
@Anandkumar 我猜你是指我的IDE?它是VS2008专业版。 - TtT23

0

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


0

我正在我的数据网格视图中使用这个解决方案。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接