DataGridViewComboBox的值无效?

3
我一直遇到一个错误,提示 DataGridViewComboBox值无效。似乎它也处于无限循环中:我会点击 ok,它会不断弹出。我正在运行一个使用 C# 和 .NET 编写的窗口表单应用程序。有人知道如何修复此错误吗?
以下是我的代码部分:
// 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;
}
6个回答

2

是的,解决方法是让DataGridViewComboBox单元格的值与您在代码后端获取到的值相同。

例如,如果我想显示typeof(int)的值,则必须设置DataGridViewComboBox单元格的属性如下:

this.ComboboxCellcolumnName.ValueType = typeof(int); 

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


0

我刚刚也遇到了类似的问题,我的一个数据表格视图不停地抛出DataError异常……最终发现是因为组合框数据源中的id类型(bigint)与引用它的列的类型(int)不同所致。


0
十年后的现在,我最近遇到了同样的问题,并通过datagridview combobox源代码来理解问题和解决方案。结果发现,即使吞咽错误事件很少是正确的做法,@mamoun是正确的:在某些情况下,捕获错误并丢弃它可能是正确的解决方案。原因如下。
在一个带有ComboBox列的DataGridView中,当加载网格数据并且绑定到combobox值的网格列中的数据无法验证时,会引发数据错误事件。
这可能会很棘手,因为comboBox值绑定到DGV中可能不是combobox本身出现的相同列(例如,它可能是隐藏列或反映combobox值的另一列)。
当然,验证可能会由于类型不匹配等开发错误而失败,但失败的常见原因是下拉数据源是固定的(不可编辑并且不允许添加新行),并且数据源已将数据传递到值列中,该数据与下拉列表中的任何现有条目都不匹配。例如,如果某些数据最初是作为自由文本输入的并且拼写错误,或者如果数据在往返到另一个更改空格或大小写的系统时,则可能会发生这种情况。如果更改馈送下拉列表的列表,也可能会发生这种情况。
在这种情况下,捕获并忽略(或最好记录)事件将导致触发错误的值被替换为组合框的默认值(通常是下拉列表的第一行)。如果这是所期望的处理方式,请吞噬它!
我找不到另一个允许在错误事件触发之前执行检测和更正的事件。尤其是,在这种情况下,CellValidating 事件不会触发。

0

然而,如果你想要恢复到你的组合框列,你需要设置一些特殊处理来进行设置。

您可以参考此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;

0

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

DataGridViewTextBoxColumn没有以下内容:

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

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


这个框原本是一个TextBoxColumn,但我把它改成了一个comboBoxColumn。所以我相信所有的设置都正确适用于一个组合框。我错了吗? - cougar
@cougar 设计文件中通常还有两个对该控件的引用:一个在文件顶部的 InitializeComponent 下面,另一个在声明处。确保这两个引用都更改为 DataGridViewComboBoxColumn。一旦正确运行,请考虑更改名称。 - LarsTech
为什么这被标记为答案,当评论似乎表明问题仍然存在? - hofnarwillie
@hofnarwillie 为什么要给答案点踩呢?我显然是在帮助那个明显是本地问题的人。也许楼主已经解决了,只是没有留下评论。这种情况时有发生。 - LarsTech
@LarsTech,不是针对你个人。只是为了让其他可能真正回答问题的答案出现在答案列表的更高位置。我认为这个答案不应该出现在顶部,因为它没有包含一个可行的解决方案。也许在某个时候,cougar会发布他标记它为答案的原因以及最终的解决方案,但在那之前,这里有其他更有用的答案供观众参考。 - hofnarwillie
显示剩余4条评论

0

我尝试了上面所有的解决方案,但都没有起作用,所以我尝试覆盖DataError事件,这样做非常好,没有任何问题:

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

1
这对我也起作用了。我最初添加它是为了尝试调试问题,但是这种方法甚至没有被执行,错误也停止抛出了。很奇怪,但它有效。 - hofnarwillie
1
这并没有解决问题,只是掩盖了它。 - siride

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接