DataGridView 与组合框列显示 System.Data.DataRowView 而不是 DisplayMember

Posted

技术标签:

【中文标题】DataGridView 与组合框列显示 System.Data.DataRowView 而不是 DisplayMember【英文标题】:DataGridView with ComboBox Column showing System.Data.DataRowView instead of DisplayMember 【发布时间】:2012-12-06 22:50:02 【问题描述】:

我正在使用 C# 4.0 WinForms。我有一个 DataGridView,它的所有列都在设计器中设置。 “Room”列是 DataGridViewComboBoxColumn 列。

所有单元格都显示正确的信息,包括房间列。但是,当我单击 Room 的 DropDown 时,列表中的项目会显示一定数量的行,这些行显示 System.Data.DataRowView 而不是 DisplayMember 属性的实际值。

我的代码如下所示:

DataTable dttRooms = GetDataTable();  //Returns rows with RoomID (GUID) and RoomType (string) columns
List<RoomType> roomType = new List<RoomType>  ; 
foreach (DataRow dr in dttRooms.Rows)

    roomType.Insert(roomType.Count, new RoomType  RoomID = Convert.ToString(dr["RoomID"]), RoomName = Convert.ToString(dr["RoomType"]) );


DataGridViewComboBoxColumn dgvc;
dgvc = (DataGridViewComboBoxColumn)dgvItems.Columns["Room"];
dgvc.HeaderText = "Room";
dgvc.DataPropertyName = "RoomID";
dgvc.DisplayMember = "RoomName";
dgvc.ValueMember = "RoomID";
dgvc.DataSource = roomType;

dgvItems.DataSource = dtForGridView; //dtForGridView contains a RoomID column with the GUID of the corresponding room.

我已经定义了一个 RoomType 类如下:

public class RoomType

    public string RoomID  get; set; 
    public string RoomName  get; set; 

如果我更改数据库中某个项目的房间,它会按预期正确显示在 GridView 组合框列上。

我已经设置了列的 DisplayMember 和 ValueMember。但是当我下拉下拉菜单来更改值时,行数是正确的,但它们似乎忽略了它们的 DisplayMember 属性。我已经尝试了很长一段时间来弄清楚我做错了什么。我花了好几个小时在 SO 上查看所有类似的问题,并且尝试了几乎所有方法。

【问题讨论】:

我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 谢谢约翰。感谢您的建议。 【参考方案1】:

我将班级名称和 RoomName 属性更改为 RoomType:

public class _RoomType

    public string RoomID  get; set; 
    public string RoomType  get; set; 

我更改了我的代码,以便名称都匹配:

DataTable dttRooms = lda.RoomDetailsGet(SeriesID, JobID);
List<_RoomType> roomType = new List<_RoomType>  ;
foreach (DataRow dr in dttRooms.Rows)

    roomType.Insert(roomType.Count, new _RoomType  RoomID = Convert.ToString(dr["RoomID"]), RoomType = Convert.ToString(dr["RoomType"]) );


DataGridViewComboBoxColumn dgvc;
dgvc = (DataGridViewComboBoxColumn)dgvItems.Columns["Room"];
dgvc.HeaderText = "Room";
dgvc.DataPropertyName = "RoomID";
dgvc.ValueMember = "RoomID";
dgvc.DisplayMember = "RoomType";
dgvc.DataSource = roomType;

dgvItems.DataSource = dtForGridView;

突然间,它按预期工作了。我仍然很想知道为什么,但至少我的问题已经解决了。

【讨论】:

以上是关于DataGridView 与组合框列显示 System.Data.DataRowView 而不是 DisplayMember的主要内容,如果未能解决你的问题,请参考以下文章

如何在datagridview组合框列中绑定数据

用 subsonic & vb.net 填充 datagridview 组合框列

将数据添加到已存在组合框列的 dataGridView 行

手动添加时绑定datagridview组合框

文本框在 DataGridview 文本框列中不可见

访问 dataGridView 列中的组合框?