DataGridViewComboBoxColumn在首次点击

时间:2015-12-31 09:11:37

标签: c# winforms datagridview

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

如果DataGridViewComboBoxColumn中有两个或多个DataGridView,其中一个的下拉列表当前处于打开状态,则点击其他列的下拉按钮不会打开该下拉菜单。相反,你仍然需要点击两次。隐藏已打开的下拉列表会消耗第一次点击,第二次点击实际上会打开您单击的下拉列表。

注意EditOnEnter模式为ON时需要两次点击;否则,您必须执行三次点击才能完成此操作。我也尝试过ContentClick事件,没有任何好处。

那么当我的网格中有多个DataGridViewComboBoxColumn时,如何使用一键操作?

更新

以防万一有人想要重现它,这是一个过程:

  1. 创建一个新的WinForms C#项目。
  2. 转到Form1&#39>代码并将其粘贴到InitializeComponent行后的构造函数中:

    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. 运行项目。单击第一个下拉列表,然后单击另一个下拉列表而不关闭第一个下拉列表。它需要2或3次点击(取决于您在第二个下拉列表中单击的位置)才能打开第二个列表。

2 个答案:

答案 0 :(得分:1)

您的代码没有任何问题。这是.NET DataGridView控件的设计行为。

如果单击下拉控件右侧的按钮(指向下箭头)而不是文本区域,则会立即显示下拉列表 - 1单击

如果您点击下拉控件的文本区域,将首先获得焦点,然后显示下拉列表 - 2次点击

如果此时另一个下拉列表已展开,则需要额外点击才能将其折叠 - 这将是 3次点击

有一些解决方法可以改善这种行为。看一下这个MSDN discussion。 恕我直言,这些改动是不值得的,但是由你来决定最适合你项目的是什么。

最诚挚的问候。

答案 1 :(得分:0)

这似乎对我有用:

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

关闭一个掉落的组合框仍然会吃一个moseclick,但就是它应该如何,imo。