数据网格视图组合框值无效

本文关键字:无效 组合 视图 数据网 网格 数据 | 更新日期: 2023-09-27 18:36:53

我不断收到一个错误,指出DataGridViewComboBox value is not valid .似乎它也处于一个无限循环中:我会点击确定,它会不断弹出。我正在运行一个程序,其中包含用 C# 和 .NET 编写的 Windows 表单应用程序。有谁知道如何解决此错误?

这是我代码的某些部分:

// authorityTypeDataGridViewTextBoxColumn
// 
this.authorityTypeDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells;
this.authorityTypeDataGridViewTextBoxColumn.DataPropertyName = "AuthorityType";
this.authorityTypeDataGridViewTextBoxColumn.DataSource = this.AuthorityTypeBindingSource;
this.authorityTypeDataGridViewTextBoxColumn.DisplayMember = "Description";
this.authorityTypeDataGridViewTextBoxColumn.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.ComboBox;
this.authorityTypeDataGridViewTextBoxColumn.Frozen = true;
this.authorityTypeDataGridViewTextBoxColumn.HeaderText = "AuthorityType";
this.authorityTypeDataGridViewTextBoxColumn.MaxDropDownItems = 100;
this.authorityTypeDataGridViewTextBoxColumn.Name = "authorityTypeDataGridViewTextBoxColumn";
this.authorityTypeDataGridViewTextBoxColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.authorityTypeDataGridViewTextBoxColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
this.authorityTypeDataGridViewTextBoxColumn.ValueMember = "Value";
this.authorityTypeDataGridViewTextBoxColumn.Width = 121;
// 
// AuthorityTypeBindingSource
// 
this.AuthorityTypeBindingSource.DataMember = "AuthorityType";
this.AuthorityTypeBindingSource.DataSource = this.lookUpDataSet;

有人有什么建议吗?

下面是处理程序:

private void TaskSummaryGrid_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    MessageBox.Show(this, e.Exception.Message);
    e.Cancel = true;
}

数据网格视图组合框值无效

是的,解决方案是使DatagridViewCombobox单元格值与您在代码隐藏中获得的值相同。

如果我想显示 typeof(int) 值,我必须设置数据网格视图组合框单元格的属性,如下所示:

this.ComboboxCellcolumnName.ValueType = typeof(int); 

您获得的值类型(例如 int)应该与您要在组合框单元格 (int) 中显示的值类型相同。

看起来您的 DataGridViewTextBoxColumn 在某些时候是 DataGridViewComboBoxColumn,因为您的 ComboBox 属性不属于 TextBox 列。

DataGridViewTextBoxColumn 没有

.DataSource = this.AuthorityTypeBindingSource;
.DisplayMember = "Description";
.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
.MaxDropDownItems = 100;
.ValueMember = "Value";

我只能猜测手动编辑设计器文件会导致这种情况。

但是,如果要恢复到组合框列,则需要设置一些特殊处理来设置它。

您可以参考此处的 MSDN 文章或下面的示例:

MSDN:将枚举绑定到 DataGridViews

        InitializeComponent();
        // special setup for enum column
        DataGridViewComboBoxColumn stateColumn = dgLedger.Columns[0] as DataGridViewComboBoxColumn;
        if (stateColumn != null)
        {
            stateColumn.DataSource = Enum.GetValues(typeof(TransactionState));
        }
        _ledger = new BindingList<LedgerItem>();
        dgLedger.DataSource = _ledger;

我刚刚对我的一个数据网格视图有类似的体验:数据错误被不停地抛出......最终证明是因为组合框数据源中的 id 与引用它的列 (int) 的类型 (bigint) 不同......

我使用了上面的所有解决方案,但没有一个有效,所以我尝试覆盖DataError event,它运行良好,没有任何问题:

private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
 //do nothing
}

十年后的今天,我最近遇到了同样的问题,最终通过datagridview组合框源代码来理解问题和解决方案。事实证明,尽管吞咽错误事件很少是正确的过程,但@mamoun是正确的:在某些情况下,捕获错误并丢弃它可能是正确的解决方案。原因如下。

在具有组合框列的 DataGridView 中,当加载网格数据并且无法验证绑定到组合框值的网格列中的数据时,将引发数据错误事件。

这可能很棘手,因为 comboBox 值绑定到 DGV 中的列,该列可能与组合框本身出现的列不同(例如,它可能是隐藏列或反映组合框值的另一列)。

当然,验证可能会由于开发错误(如类型不匹配)而失败,但失败的常见原因是下拉列表数据源是固定的(不可编辑且不允许添加新行),并且数据源在值列中传递的数据与下拉列表中的任何现有条目都不匹配。例如,如果某些数据最初以自由文本形式输入并且拼写错误,或者数据往返到另一个更改空格或大小写的系统,则可能会发生这种情况。如果您更改提供下拉列表的列表,则可能会发生这种情况。

在这种情况下,捕获和忽略(或最好记录)事件将导致触发错误的值替换为组合框中的默认值(通常是下拉列表的第一行)。如果这是所需的处理方式,请吞下!

我找不到另一个允许在错误事件触发之前进行检测和更正的事件。特别是,在这种情况下不会触发单元格验证事件。