.NET Windows Forms datagridview - 必须单击三次组合框列才能获得焦点

时间:2009-11-11 15:43:12

标签: .net winforms datagridview combobox

我正在制作一个标准DataGridView的Windows窗体应用程序。 DataGridView中包含多个DataGridViewComboBoxColumn个。他们很难与之合作。要让其中一个打开(如下拉列表),您必须至少单击3(!!!)次单元格。似乎第一次点击结束了前一个单元格的编辑;第二次点击激活单元格;只有第三次点击才会被发送到组合框本身。用户界面的噩梦,特别是当你必须通过这些组合框输入大量数据时。

有解决方法吗?

已添加:我刚试了一个空白的解决方案。只有一个带有单个datagridview的表单。同样的问题。我的同事们遇到了同样的问题,所以我不能成为唯一一个这样的人。没有标准的解决方法吗?

5 个答案:

答案 0 :(得分:3)

我遇到了与我的DataGridView相同的问题。我通过在DataGridView处理点击本身之前更改所选单元格来解决问题:

// Subscribe to DataGridView.MouseDown when convenient
this.dataGridView.MouseDown += this.HandleDataGridViewMouseDown;

private void HandleDataGridViewMouseDown(object sender, MouseEventArgs e)
{
    // See where the click is occurring
    DataGridView.HitTestInfo info = this.dataGridView.HitTest(e.X, e.Y);

    if (info.Type == DataGridViewHitTestType.Cell)
    {
        switch (info.ColumnIndex)
        {
            // Add and remove case statements as necessary depending on
            // which columns have ComboBoxes in them.

            case 1: // Column index 1
            case 2: // Column index 2
                this.dataGridView.CurrentCell =
                    this.dataGridView.Rows[info.RowIndex].Cells[info.ColumnIndex];
                break;
            default:
                break;
        }
    }
}

答案 1 :(得分:1)

如果您对其他非组合框控件有何影响,这是一个非常简单的方法:将DataGridView EditMode属性设置为EditOnEnter。

来自http://social.msdn.microsoft.com/Forums/en/winforms/thread/bc454d5c-a1cb-4abb-939c-f16eb025d4cc

答案 2 :(得分:1)

我遇到了同样的麻烦,发现/想出了这个解决方案。它允许首次关注组合框和文本框,同时允许用户选择行标题来删除项目。

someDGV.EditMode = DataGridViewEditMode.EditOnEnter;  
someDGV.CellClick += new DataGridViewCellEventHandler(DGV_CellClick);

private void DGV_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        DataGridView dgv = ((DataGridView)sender);
        if (e.ColumnIndex < 0)
        {
            dgv.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
            dgv.Focus();
            dgv.EndEdit(); 
        }
        else
        {
            dgv.EditMode = DataGridViewEditMode.EditOnEnter;
            dgv.BeginEdit(false);
        }
    }

答案 3 :(得分:0)

我在自己的一个项目中遇到了同样的问题。

我不确定这个的所有后果,但是我在输入组合框时通过发送F4来处理这个问题。它有效,但我希望它不会让事情发生变化。

例如:

'This call opens up the ComboBox dropdown immediately instead of having to click into it three times to open the stupid thing
SendKeys.Send("{F4}")

我从你的评论中可以看出你感到沮丧;)

答案 4 :(得分:0)

实际上这两个例子都不适合我。 发送“F4”是不好的情况,因为SendKeys.Send(...)具有不稳定的行为(MSDN)。 此外,您无法在WPF项目中将SendFeys与WinForm窗口一起使用。

Zach Johnson有很好的榜样,但是为了正常工作,应该有一些修改:

// Subscribe to DataGridView.MouseDown when convenient
this.dataGridView.MouseDown += this.HandleDataGridViewMouseDown;

private void HandleDataGridViewMouseDown(object sender, MouseEventArgs e)
{
    // See where the click is occurring
    DataGridView.HitTestInfo info = this.dataGridView.HitTest(e.X, e.Y);

    if (info.Type == DataGridViewHitTestType.Cell)
    {
        switch (info.ColumnIndex)
        {
            // Add and remove case statements as necessary depending on
            // which columns have ComboBoxes in them.

            case 1: // Column index 1
            case 2: // Column index 2
                this.dataGridView.CurrentCell =
                    this.dataGridView.Rows[info.RowIndex].Cells[info.ColumnIndex];

                //Begin edit current cell
                this.dataGridView.BeginEdit(true);
                //Find cell control, if it is combobox then drop it down 
                DataGridViewComboBoxEditingControl comboBoxCellControl = 
                this.dataGridView.EditingControl as DataGridViewComboBoxEditingControl;
                    if (comboBoxCellControl != null)
                    {
                        comboBoxCellControl.DroppedDown = true;
                    }
                break;
            default:
                break;
        }
    }
}