【问题标题】:How to activate combobox on first click (Datagridview)如何在第一次单击时激活组合框(Datagridview)
【发布时间】:2012-10-22 04:53:52
【问题描述】:

在winforms中,你需要点击组合框两次才能正确激活——第一次聚焦,第二次实际获取下拉列表。

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

这是用于 DATAGRIDVIEW 组合框的。

【问题讨论】:

  • 如果你直接点击下拉箭头,它会被激活。对吧?
  • @Rockstart 不行,它必须先聚焦,然后你可以在第二次尝试时激活它
  • 用这个Link它会解决你的问题

标签: c# .net winforms datagridview combobox


【解决方案1】:

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

虽然我找不到任何答案来做到这一点......但我确实找到了一个 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 进行上述编辑

edit2:代码现在被绑定到 CellEnter 而不是 CellClick 事件。

感谢HaraldDutch 进行上述编辑

edit3:任何更改都将立即提交,这样您就不必单击另一个单元格来更新当前的组合框单元格。

【讨论】:

  • 这很有帮助,在我看来是获得它的正确方法。 gridView.EditMode = DataGridViewEditMode.EditOnEnter 仅单击箭头打开下拉菜单。
  • 我多次遇到这个问题,结果证明这是正确的(并且很可能是大多数用户唯一明智的答案)答案。对于遇到此问题的其他人,请在此答案与此处投票最多的答案之间进行直接比较。你肯定会看到很大的不同。
  • 唉,如果您使用键盘在单元格中导航,这将不起作用。使用事件 CellEnter 而不是单元格点击
  • @HaraldDutch 谢谢!我会调整我的答案。
【解决方案2】:

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

这将为您带来您想要的结果。如果不这样做,请告诉我。

【讨论】:

  • 这就是我所做的。仍然需要用户在激活下拉列表之前先聚焦控件。
  • 它应该在第一次单击时激活该更改。它对你这样做吗?当设置调整为上述设置时,它似乎为我聚焦并调出下拉菜单。
  • 如果您单击箭头,它会执行此操作。我希望在单击整个单元格时发生这种行为(即:文本部分)
  • @l46kok 我想你可能会遇到一些额外的问题。继续制作一个新的 winforms 应用程序,添加 1 个未绑定的 comboboxxolumn 并尝试。您会看到第二个工作正常。
【解决方案3】:

我只将datagridviewEditMode 属性更改为EditOnEnter,它运行良好。

EditMode  = EditOnEnter

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 这就是我所做的。如果组合框没有焦点,则仍然需要用户单击两次
      • @l46kok,是否有任何事件与组合框相关联?
      • @Anandkumar 不。只是具有上述属性的普通旧组合框已更改。编辑:天哪,我忘了提到这是针对 DGV 的组合框的。对不起。
      • @Anandkumar 我假设你的意思是我的 IDE?这是VS2008专业版
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        • 2016-01-14
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多