【问题标题】:Winform EF Data Grid View Databinding results in DataGridViewComboBoxCell value is not validWinform EF Datagridview 数据绑定导致 DataGridViewComboBoxCell 值无效
【发布时间】:2018-08-03 17:58:36
【问题描述】:

与DataGridViewComboBoxCell Binding - "value is not valid" 略微相关 - 我有一个 EF Database First 项目,其中我有三个表(当然还有匹配的类表示):

测定历史值

检测结果类型

AssayUsageType

“类型”表中包含名称描述,但 DataGridView 需要从 ComboBox 中选择名称并将 ID 本身存储在后台数据库中。

我在编辑列 UI 中设置了所有这些,该 UI 对设计器代码进行了调整 - 一切看起来都正常:

然后,当我意识到抛出错误时:

DataGridViewComboBoxCell 值无效

我意识到其他一些人也有这个问题(比如我上面链接的帖子)和其他地方的在线。有人说抑制错误对他们有用,但这只会导致以下错误:

'当 DataSource 属性为 设置。'

在它所在的行 Items.Add 下面:

private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    //Avoid error of data bound combobox cells
    if (e.Exception.Message == "DataGridViewComboBoxCell value is not valid.")
    {
        object value = ConstantsGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
        if (!((DataGridViewComboBoxColumn)ConstantsGridView.Columns[e.ColumnIndex]).Items.Contains(value))
        {
            ((DataGridViewComboBoxColumn)ConstantsGridView.Columns[e.ColumnIndex]).Items.Add(value);
            e.ThrowException = false;
        }
    }
}

此外,我尝试仅在列中使用“AssayResultType”或 Usage 类型对象(当您添加要更新的实体对象/表时,它会预先弹出) - 这也不起作用。

我可能更容易编写 LINQ 语句等来填充所有这些,因为结构非常简单,但我觉得这里设置的绑定应该为这样的事情完成大部分工作。想到这里可能会发生什么?

有问题的 2 个表的 SQL(如果需要 - 如果我们可以使用 Result Type 获得 1 个关系,则 Usage Type 也应该没问题,因为它实际上是相同的):

CREATE TABLE [dbo].[tblAssayHistoricalValue](
    [AssayHistoricalValueId] [int] IDENTITY(1,1) NOT NULL,
    [AssayResultTypeId] [int] NOT NULL,
    [AssayUsageTypeId] [int] NOT NULL,
    [MeanValue] [float] NOT NULL,
    [StandardDeviationValue] [float] NOT NULL,
    [RValue] [float] NOT NULL,
 CONSTRAINT [PK_tblAssayHistoricalValue] PRIMARY KEY CLUSTERED 
(
    [AssayHistoricalValueId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tblAssayHistoricalValue]  WITH CHECK ADD  CONSTRAINT [FK_tblAssayHistoricalValue_tblAssayResultType] FOREIGN KEY([AssayResultTypeId])
REFERENCES [dbo].[tblAssayResultType] ([AssayResultTypeId])
GO

ALTER TABLE [dbo].[tblAssayHistoricalValue] CHECK CONSTRAINT [FK_tblAssayHistoricalValue_tblAssayResultType]
GO

ALTER TABLE [dbo].[tblAssayHistoricalValue]  WITH CHECK ADD  CONSTRAINT [FK_tblAssayHistoricalValue_tblAssayUsageType] FOREIGN KEY([AssayUsageTypeId])
REFERENCES [dbo].[tblAssayUsageType] ([AssayUsageTypeId])
GO

ALTER TABLE [dbo].[tblAssayHistoricalValue] CHECK CONSTRAINT [FK_tblAssayHistoricalValue_tblAssayUsageType]
GO


CREATE TABLE [dbo].[tblAssayResultType](
    [AssayResultTypeId] [int] NOT NULL,
    [AssayId] [int] NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [Description] [varchar](256) NULL,
 CONSTRAINT [PK_tblAssayResultType] PRIMARY KEY CLUSTERED 
(
    [AssayResultTypeId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tblAssayResultType]  WITH CHECK ADD  CONSTRAINT [FK_tblAssayResultType_tblAssay] FOREIGN KEY([AssayId])
REFERENCES [dbo].[tblAssay] ([AssayId])
GO

ALTER TABLE [dbo].[tblAssayResultType] CHECK CONSTRAINT [FK_tblAssayResultType_tblAssay]
GO

【问题讨论】:

  • AssayResultTypeId 在AssayHistoricalValue 表中的默认值是多少?是否允许为null?
  • 它不允许 AssayResultType 和 AssayUsageType ID 为 NULL - HistoricalValue Id 当然是 PK 并且是 IDENTITY 类型。
  • Id 字段的类型是什么?
  • 对所有 Id 字段使用 Ints - 为 AssayHistoricalValueId 设置 PK
  • 我将把我的 SQL 用于上面 3 个表中的 2 个(如果我们只使用一种类型,应该可以正常工作)——唯一真正的区别是生成的类没有“tbl-”前缀。

标签: c# winforms entity-framework data-binding datagridview


【解决方案1】:

根据图片您允许用户在DataGridView 中添加新记录。如果是这种情况,DataGridView 将尝试将AssayResultTypeId 列(integer => 0) 的默认值绑定到对应组合框列的DataSource。

作为解决方法,您可以尝试在 DataGridView 中禁用 Allow add rows 选项。

或者在组合框列的绑定源中添加“空”记录

var defaultResult = new AssayResultType { Id = 0, Name = "Please select type..." };

// Insert because you want keep it on the top of the list
resultTypesCollection.Insert(0, defaultResult); 

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多