【问题标题】:Cell with Datagridviewcombobox column displays the ValueMember instead of DisplayMember具有 Datagridviewcombobox 列的单元格显示 ValueMember 而不是 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

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案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 的有效值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多