winforms DataGridViewComboBox值无效?

ttcibm8c  于 2022-12-23  发布在  其他
关注(0)|答案(6)|浏览(286)

我一直收到一个错误,状态为DataGridViewComboBox value is not valid。它似乎也处于无限循环中:我会点击确定,它会不断弹出。我正在运行一个程序与windows窗体应用程序编写的c#和idonnet。有人知道如何修复这个错误吗?
下面是我的部分代码:

// 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;
}
cgyqldqp

cgyqldqp1#

是的,解决方案是使datagridviewcombobox单元格的值与您在后面的代码中获得的值相同。
如果我想显示typeof(int)值,我必须设置datagridviewcombobox单元格的属性,如:

this.ComboboxCellcolumnName.ValueType = typeof(int);

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

lskq00tm

lskq00tm2#

看起来您的DataGridViewTextBoxColumn在某个点上是DataGridViewComboBoxColumn,因为您具有不属于TextBox列的ComboBox属性。
数据网格视图文本框列没有

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

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

qrjkbowd

qrjkbowd3#

但是,如果您希望恢复到组合框列,则需要设置一些特殊的处理来进行设置。
您可以参考此处的MSDN文章或下面的示例:
MSDN: Binding Enums to 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;
hyrbngr7

hyrbngr74#

我刚刚在使用我的一个数据网格视图时有过类似的经历:DataError不断地被抛出......最终证明是因为组合框DataSource中的id与引用它的列(int)的类型(bigint)不同......

nwsw7zdq

nwsw7zdq5#

我使用了上面所有的解决方案,但没有一个工作,所以我试图覆盖**DataError event**,它工作得很好,没有任何问题:

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

c6ubokkw6#

十年后的今天,我最近遇到了同样的问题,并最终通过研究datagridview组合框源代码来理解问题和解决方案。事实证明,尽管吞下错误事件很少是正确的做法,但@mamoun是正确的:在某些情况下,捕获错误并丢弃它可能是正确的解决方案。
在具有ComboBox列的DataGridView中,当加载网格数据但无法验证绑定到ComboBox值的网格列中的数据时,将引发数据错误事件。
这可能是棘手的,因为组合框值被绑定到DGV中的列,该列可能不是组合框本身出现在其中的同一列(例如,它可能是隐藏列或反映组合框值的另一列)。
当然,验证可能会由于开发错误(如类型不匹配)而失败,但失败的常见原因是下拉数据源已修复的场景(不可编辑且不允许添加新行),并且数据源在值列中提供的数据与下拉列表中的任何现有条目都不匹配。例如,可能会发生这种情况如果某些数据最初是作为自由文本输入的,但拼写错误,或者如果数据往返于另一个系统而更改白色或大小写,则可能会发生这种情况。如果您更改了下拉列表的输入列表,则可能会发生这种情况。
在这种情况下,捕获并忽略(或者最好是记录)事件将导致触发错误的值被替换为组合框(通常是下拉列表的第一行)中的默认值。
我无法找到另一个允许在错误事件触发之前执行检测和纠正的事件,特别是在这种情况下,CellValidating事件不会触发。

相关问题