我正在制作一个标准DataGridView
的Windows窗体应用程序。 DataGridView
中包含多个DataGridViewComboBoxColumn
个。他们很难与之合作。要让其中一个打开(如下拉列表),您必须至少单击3(!!!)次单元格。似乎第一次点击结束了前一个单元格的编辑;第二次点击激活单元格;只有第三次点击才会被发送到组合框本身。用户界面的噩梦,特别是当你必须通过这些组合框输入大量数据时。
有解决方法吗?
已添加:我刚试了一个空白的解决方案。只有一个带有单个datagridview的表单。同样的问题。我的同事们遇到了同样的问题,所以我不能成为唯一一个这样的人。没有标准的解决方法吗?
答案 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;
}
}
}