带有ComboBox列的DataGridView显示System.Data.DataRowView而不是DisplayMember

时间:2012-12-06 22:50:03

标签: c# c#-4.0 datagridview datagridviewcombobox

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

所有单元格都显示正确的信息,包括房间列。但是,当我单击DropDown for Room时,列表中的项目显示的行数量表示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属性。我一直在努力弄清楚我做错了什么。我花了好几个小时看着所有类似的问题,并尝试了几乎所有的东西。

1 个答案:

答案 0 :(得分:0)

我将Class的名称和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;

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