我正在使用C# WinForms .NET 4.7.2
. DataGridViewComboBoxColumn
在DataGridView
. _ 当我使用自动附加功能将数据输入其中时(只需要数据输入的第一个字符),我看到出现了正确的下拉项。如果我快速切换到下一个单元格,有时输入的值会从ComboBox
单元格中消失。只有当我快速进入和离开列时才会发生这种情况(像大多数数据输入人员一样使用标签)。此错误迫使数据输入人员返回空白列并重试。如果它们再次太快,它可能会再次保持空白。我已经测试了许多场景和事件,但无法确定导致这种情况的原因,因为在(例如)中设置断点CurrentCellDirtyStateChanged
事件导致该错误不再出现。这似乎与速度有关,因为当我更慢地浏览时,我无法重现这种行为。
如果它不是一个错误,那就太好了,你可以告诉我我做错了什么导致这种行为。否则,如果它是一个错误,那么迫使价值坚持下去的变通方法会很棒。
我可以使用以下新项目重现该错误。该错误在我的实际项目中更为明显,因此我认为该错误可能会随着规模的扩大而变得更糟。奇怪的是我以前没有遇到过这种情况,因为这不是我第一次ComboBoxColumns
在DataGridView
.
如何重新创建:
- 在 VS 中创建一个新的 C# WinForms 项目(我使用的是 MS VS Pro 2019 RC V 16)
- 在表单中添加一个
DataGridView
并完全停靠它 - 表格代码:
using System;
using System.Data;
using System.Windows.Forms;
namespace TestingStuff
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
DataTable dtString1;
DataTable dtString2;
DataTable dtString3;
private void Form1_Load(object sender, EventArgs e)
{
// create three combobox columns and put them side-by-side:
// first column:
DataGridViewComboBoxColumn dgvcbc1 = new DataGridViewComboBoxColumn();
dgvcbc1.DataPropertyName = "String1";
dgvcbc1.Name = "String1";
dtString1 = new DataTable("String1Options");
dtString1.Columns.Add("String1Long", typeof(string));
dtString1.Rows.Add("apple");
dtString1.Rows.Add("bob");
dtString1.Rows.Add("clobber");
dtString1.Rows.Add("dilbert");
dtString1.Rows.Add("ether");
dgv.Columns.Insert(0, dgvcbc1);
dgvcbc1.DisplayMember = dtString1.Columns[0].ColumnName;
dgvcbc1.ValueMember = dtString1.Columns[0].ColumnName;
dgvcbc1.DataSource = dtString1;
dgvcbc1.FlatStyle = FlatStyle.Flat;
// create the second column:
DataGridViewComboBoxColumn dgvcbc2 = new DataGridViewComboBoxColumn();
dgvcbc2.DataPropertyName = "String2";
dgvcbc2.Name = "String2";
dtString2 = new DataTable("String2Options");
dtString2.Columns.Add("String2Long", typeof(string));
dtString2.Rows.Add("apple");
dtString2.Rows.Add("bob");
dtString2.Rows.Add("clobber");
dtString2.Rows.Add("dilbert");
dtString2.Rows.Add("ether");
dgv.Columns.Insert(1, dgvcbc2);
dgvcbc2.DisplayMember = dtString2.Columns[0].ColumnName;
dgvcbc2.ValueMember = dtString2.Columns[0].ColumnName;
dgvcbc2.DataSource = dtString2;
dgvcbc2.FlatStyle = FlatStyle.Flat;
// create the third column:
DataGridViewComboBoxColumn dgvcbc3 = new DataGridViewComboBoxColumn();
dgvcbc3.DataPropertyName = "String3";
dgvcbc3.Name = "String3";
dtString3 = new DataTable("String3Options");
dtString3.Columns.Add("String3Long", typeof(string));
dtString3.Rows.Add("apple");
dtString3.Rows.Add("bob");
dtString3.Rows.Add("clobber");
dtString3.Rows.Add("dilbert");
dtString3.Rows.Add("ether");
dgv.Columns.Insert(2, dgvcbc3);
dgvcbc3.DisplayMember = dtString3.Columns[0].ColumnName;
dgvcbc3.ValueMember = dtString3.Columns[0].ColumnName;
dgvcbc3.DataSource = dtString3;
dgvcbc3.FlatStyle = FlatStyle.Flat;
}
}
}
- 运行
- 快速输入您的数据(
[Tab]
有效地使用密钥) - 请注意,您的
DataGridViewComboBoxColumn
值有时会在离开单元格后立即消失
感谢您的任何见解。