具有 Datagridviewcombobox 列的单元格显示 ValueMember 而不是 DisplayMember

Posted

技术标签:

【中文标题】具有 Datagridviewcombobox 列的单元格显示 ValueMember 而不是 DisplayMember【英文标题】:Cell with Datagridviewcombobox column displays the ValueMember instead of DisplayMember 【发布时间】:2017-06-28 06:46:09 【问题描述】:

我有一个从数据库绑定数据的 Datagridview。

 DataGridViewTextBoxColumn colOperationID = new DataGridViewTextBoxColumn();
 colOperationID.Name = "OperationID";
 colOperationID.DataPropertyName = "OperationID";
 BOMOperations.Columns.Add(colOperationID);

 DataGridViewComboBoxColumn colOperationDesc = new DataGridViewComboBoxColumn();
 colOperationDesc.Name = "OperationDesc";
 colOperationDesc.DataSource = srcDT;
 colOperationDesc.DisplayMember = "OperationDesc";
 colOperationDesc.ValueMember = "OperationID";
 colOperationDesc.DataPropertyName = "OperationDesc";
 colOperationDesc.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
 colOperationDesc.DefaultCellStyle.BackColor = Color.White;
 colOperationDesc.DisplayStyleForCurrentCellOnly = true;
 BOMOperations.Columns.Add(colOperationDesc);

然后用户将单击编辑按钮,datagridview 将变为可编辑。我的问题是,当我单击 datagridviewcombobox 列时,我将选择一个项目,该项目将正确显示(DisplayMember),但只要单元格失去焦点,组合框的单元格就会显示 ValueMember。

我已经尝试过我在这里检查数据类型的解决方案,但我的解决方案是正确的。 DisplayValue 是一个字符串,而 DisplayValue 是一个 int。

我还尝试将以下行 colOperationDesc.DataPropertyName = "OperationDesc"; 更改为 colOperationDesc.DataPropertyName = "OperationID";,它给了我这个例外。 exception

【问题讨论】:

【参考方案1】:

colOperationDesc.DataPropertyName 应该是DataGridView.DataSource 中列的名称,并且应该“引用”与colOperationDesc.ValueMember 中相同的值。

注意colOperationDesc.ValueMembercolOperationDesc.DisplayMember 应该是来自colOperationDesc.DataSource 的属性/列名,在您的情况下来自srcDT 变量。

但只要单元格失去焦点,组合框的单元格就会显示 价值成员

这是因为在 srcDT 变量中找不到列/属性“OperationDesc”(DisplayMember)。

【讨论】:

我已经尝试更改 colOperationDesc.DataPropertyName = "OperationID" 但它给了我一个 System.Exception is not a valid value for Int32。 @Zhyke - 请检查colOperationDesc.ValueMembercolOperationDesc.DisplayMember 中使用的属性/列是否存在于srcDT 变量中 它们确实存在于数据表 srcDT 中。我更新了我的帖子并上传了我更改 DataPropertyName 时遇到的异常。这是我的数据源的代码:cmd = new SqlCommand(); srcDT = new DataTable(); cmd.CommandText = "SELECT OperationID, OperationDesc FROM Operation"; srcDT = _SQL.GetData(cmd); colOperationDesc.DataSource = srcDT; colOperationDesc.ValueMember = "OperationID"; colOperationDesc.DisplayMember = "OperationDesc"; @Zhyke, DataPropertyName 应引用 DataGridView.DataSource 中使用的来自DataTable 的列,并且与srcDT 中的“OperationId”类型完全相同。您是否在代码中的某处使用了选定的值?哪一行抛出异常? 是的,它们确实具有相同的列名和相同的数据类型。我正在使用更改的选定值来填充我的 datagridview 中的其他字段。实际上例外只是一个弹出对话框。谢谢。【参考方案2】:

您可以将DataPropertyName 设置为OperationID

colOperationDesc.DataPropertyName = "OperationID";

【讨论】:

谢谢,但我已经尝试过了,它给了我一个 System.Exception: 不是 Int32 的有效值。

以上是关于具有 Datagridviewcombobox 列的单元格显示 ValueMember 而不是 DisplayMember的主要内容,如果未能解决你的问题,请参考以下文章

具有 Datagridviewcombobox 列的单元格显示 ValueMember 而不是 DisplayMember

如何在 DataGridViewComboBox 列中绘制非活动行?

dataGridViewCombobox 值未保存在导航器上保存按钮单击

在 DataGridViewComboBox 列上设置值非常慢

DataGridViewComboBox 数据源

DataGridViewCombobox 列中的自动完成有啥奇怪的行为?