Winform EF数据网格视图DataGridViewComboBoxCell中的数据绑定结果值无效

时间:2018-08-03 17:58:36

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

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

  

AssayHistoricalValue

     

AssayResultType

     

AssayUsageType

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

我在“编辑列” UI中进行了所有设置,从而对Designer代码进行了调整-一切看起来都正确:

enter image description here

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

  

DataGridViewComboBoxCell值无效

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

  

'当DataSource属性为   设置。”

在执行项目的行。在下面添加:

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”或“用法”类型的对象(当您添加要更新的实体对象/表时,它会预先弹出)-也不起作用。

我可以更容易地编写LINQ语句之类的东西来填充所有这些内容,因为结构非常简单,但是我觉得这里设置的绑定应该为这样的事情做大部分工作。对这里可能会有什么想法?

针对有问题的2个表的SQL(以防万一-如果我们可以使用结果类型获得1个关系,则使用类型也应该是正确的,因为它实际上是相同的):

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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);