DataGridViewComboBoxColumn在第一次单击时不打开下拉菜单。

7

在有人将此标记为重复之前,请注意,这与这里这里这里所提出的问题不同。

当您的DataGridView中有两个或更多DataGridViewComboBoxColumn,其中一个下拉列表当前处于打开状态时,单击另一列的下拉按钮不会打开该下拉列表。相反,您仍然需要点击两次。第一次单击用于隐藏已经打开的下拉列表,第二次单击才会打开您单击的下拉列表。

请注意,在EditOnEnter模式开启时需要进行两次单击;否则,您将需要执行三次单击才能完成此操作。我也尝试了ContentClick事件,但没有任何收获。

那么,在我网格中有多个DataGridViewComboBoxColumn的情况下,如何使用单击操作呢?

更新

以防有人想要重现它,这里是过程:

  1. Create a new WinForms C# project.
  2. Go to Form1's code and paste this in the constructor after the InitializeComponent line:

    DataGridView dgv = new DataGridView();
    DataGridViewComboBoxColumn col1 = new DataGridViewComboBoxColumn();
    DataGridViewComboBoxColumn col2 = new DataGridViewComboBoxColumn();
    
    dgv.Columns.AddRange(new DataGridViewColumn[] { col1, col2 });
    dgv.Dock = DockStyle.Fill;
    dgv.EditMode = DataGridViewEditMode.EditOnEnter;
    
    col1.Items.AddRange(new object[] { "Cat", "Dog", "Elephant", "Lion" });
    col2.Items.AddRange(new object[] { "Duck", "Hen", "Crow", "Sparrow" });
    
    this.Controls.Add(dgv);
    
  3. Run the project. Click on the first drop-down, then click on the other dropdown without closing the first one. It will take 2 or 3 clicks (depending upon where you click in the second dropdown) to get the second list opened.


你能给我们提供一些代码吗? - Julien698
1
@Julien698:它不需要任何特殊的代码。将一个DataGridView添加到你的表单中。添加两个DataGridViewComboBoxColumns到其中,并放入一些项目。将EditMode设置为EditOnEnter,然后按下F5。 - dotNET
1
@Julien698:我已经添加了代码,以防您想要产生效果。 - dotNET
2个回答

2
这对我来说似乎有效:
EditMode设置为EditProgramatically 编写CellMouseClick事件:
private void dgv_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    // maybe do a column type check before..!?
    dgv.BeginEdit(false);
    var ec = dgv.EditingControl as DataGridViewComboBoxEditingControl;
    if (ec != null && ec.Width - e.X < SystemInformation.VerticalScrollBarWidth ) 
       ec.DroppedDown = true;
}

关闭一个下拉框仍会吞噬一个鼠标点击,但这应该是正确的做法,我认为。

1
你的代码没有问题。这是.NET DataGridView控件的设计行为。
如果您点击下拉控件右侧的按钮(向下箭头),下拉列表将立即显示 - 1次单击。
如果您点击下拉控件的文本区域,它将首先获得焦点,然后显示下拉列表 - 2次单击。
如果此时另一个下拉列表已展开,则需要额外单击才能折叠它 - 这将是3次单击。
有几种解决方法可以改善此行为。请查看MSDN discussion。在我看来,这些修改并不值得,但是您可以自行决定哪种最适合您的项目。
此致敬礼。

谢谢你的建议,Alex。我查看了MSDN的讨论,这给了我一个新的解决方案;即手动释放鼠标捕获。我发现基本问题是下拉列表保持鼠标捕获,至少需要在列表边界外进行一次鼠标单击才能释放该捕获。经过一个小时的尝试,我最终放弃了。这个问题比我最初想象的要难解决。 - dotNET
1
最后,如果需要点击两次网格才能展开下拉菜单真的是个问题,您可以考虑购买一些第三方控件,如Telerik、Infragistics、SyncFusion等,甚至可以选择像SourceGrid这样的MIT许可证控件...干杯。 - Alex X.

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