0

我正在使用C# WinForms .NET 4.7.2. DataGridViewComboBoxColumnDataGridView. _ 当我使用自动附加功能将数据输入其中时(只需要数据输入的第一个字符),我看到出现了正确的下拉项。如果我快速切换到下一个单元格,有时输入的值会从ComboBox单元格中消失。只有当我快速进入和离开列时才会发生这种情况(像大多数数据输入人员一样使用标签)。此错误迫使数据输入人员返回空白列并重试。如果它们再次太快,它可能会再次保持空白。我已经测试了许多场景和事件,但无法确定导致这种情况的原因,因为在(例如)中设置断点CurrentCellDirtyStateChanged事件导致该错误不再出现。这似乎与速度有关,因为当我更慢地浏览时,我无法重现这种行为。

如果它不是一个错误,那就太好了,你可以告诉我我做错了什么导致这种行为。否则,如果它是一个错误,那么迫使价值坚持下去的变通方法会很棒。

我可以使用以下新项目重现该错误。该错误在我的实际项目中更为明显,因此我认为该错误可能会随着规模的扩大而变得更糟。奇怪的是我以前没有遇到过这种情况,因为这不是我第一次ComboBoxColumnsDataGridView.

如何重新创建:

  1. 在 VS 中创建一个新的 C# WinForms 项目(我使用的是 MS VS Pro 2019 RC V 16)
  2. 在表单中添加一个DataGridView并完全停靠它
  3. 表格代码:
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;

        }
    }
}
  1. 运行
  2. 快速输入您的数据([Tab]有效地使用密钥)
  3. 请注意,您的DataGridViewComboBoxColumn值有时会在离开单元格后立即消失

感谢您的任何见解。

4

0 回答 0