【问题标题】:DataGridViewComboBox value is not valid?DataGridViewComboBox 值无效?
【发布时间】:2012-06-14 15:40:59
【问题描述】:

我不断收到一条错误消息,指出 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;
}

【问题讨论】:

    标签: c# .net winforms datagridview datagridviewcombobox


    【解决方案1】:

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

    DataGridViewTextBoxColumn没有有:

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

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

    【讨论】:

    • 该框是一个TextBoxColumn,但后来我将它更改为一个comboBoxColumn。所以我相信所有设置对于组合框都是正确的。我错了吗?
    • @cougar 在设计器文件中通常还有两个对这个控件的引用:一个在文件顶部的InitializeComponent 下,在最后声明它的位置。确保将这两个都更改为DataGridViewComboBoxColumn。考虑更改名称,一旦你让它正常工作。
    • 我最终只是删除了该列并重新添加它。我认为它可能正在工作。在我给你答案之前让我快速测试一下
    • 那是另一个问题,它把我放在 dataerror 处理程序上,但不会把我带到其他地方。我现在发布处理程序的代码。
    • @cougar 尝试注释掉整个数据错误代码并运行它以查看它是否在某处的代码行中断。
    【解决方案2】:

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

    你可以参考这里的 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;
    

    【讨论】:

      【解决方案3】:

      我刚刚对我的一个 datagridviews 有过类似的体验:DataError 被不停地抛出......最终证明是因为组合框 DataSource 中的 id 的类型 (bigint) 与引用它(int)...

      【讨论】:

        【解决方案4】:

        是的,解决方案是使 datagridviewcombobox 单元格值与您在后面的代码中获得的值相同。

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

        this.ComboboxCellcolumnName.ValueType = typeof(int); 
        

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

        【讨论】:

          【解决方案5】:

          我使用了上述所有解决方案,但都没有奏效,所以我尝试覆盖 DataError event 并且效果很好,没有任何问题:

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

          【讨论】:

          • 这对我也有用。我最初添加它是为了尝试调试问题,但该方法甚至没有被命中并且错误停止被抛出。很奇怪,但它奏效了。
          • 这并不能解决问题,只是用纸盖住它。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-28
          • 2018-10-19
          • 1970-01-01
          • 2011-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多