2012-02-14 116 views
0

我有一个datagridview用于输入数据。我之前已经完成了所有文本列,而且效果很好。但是现在我希望其中一列是数据绑定组合框,以便用户可以选择选项。当我这样做时,所得到的gridview的数据源以空行(但数量正确)结束。我错过了什么?使用DataGridViewComboboxColumn输入时遇到问题

这里是代码:

DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn(); 
{ 
    cboCategory.HeaderText = "Category"; 
    cboCategory.DataSource = downtimeCategories; 
    cboCategory.DisplayMember = "Name"; 
    cboCategory.ValueMember = "CategoryID"; 
    cboCategory.DataPropertyName = "CategoryID"; 

    gridDowntime.Columns.Add(cboCategory); 
} 

然后代码获取GridView的数据源:

DataTable dt = (gridDowntime.DataSource as DataTable); 

每次我得到了正确的号码行的表,但所有的行都是空的(尽管它们是长行,数据集可视化器必须滚动才能显示整个单元格)。我怎样才能找到错误和正确的?

编辑:我应该在这里提供一些具体的附加信息吗?

+1

你能提供(populalting的数据表,将其分配到网格的数据源,等...)你正在尝试做的是相当直接的,但没有完整的代码,它是完整的代码很难说出错的地方。 (可能我们可以讨论聊天,如果你在线) – 2012-02-15 15:34:15

+1

另外 - 它不明确 - 但是当你说行是空的,你是否意味着在数据表中,当你试图在数据入口后检查它?为什么你不绑定到表单级数据表,然后直接引用该对象?不知道这种调整是否能解决问题,但它会使代码更清洁。 – 2012-02-15 15:38:57

+0

我想通过它聊天,我如何邀请你聊天? – MAW74656 2012-02-15 15:48:39

回答

1

这是一个简单的示例项目,我刚刚制作完成。

我认为你出错的关键是的DataPropertyName属性需要引用DataGridView的数据源,而不是列。

public Form1() 
{ 
    InitializeComponent(); 

    DataTable dt = new DataTable("Customers"); 
    DataColumn dc; 

    dc = new DataColumn(); 
    dc.DataType = typeof(int); 
    dc.ColumnName = "CustomerID"; 

    dt.Columns.Add(dc); 
    dt.Columns.Add(new DataColumn("LastName")); 
    dt.Columns.Add(new DataColumn("FirstName")); 
    // Concatenation of first and last names 
    dt.Columns.Add(new DataColumn("FullName")); 
    dt.Columns.Add(new DataColumn("Address")); 
    dt.Columns.Add(new DataColumn("City")); 
    dt.Columns.Add(new DataColumn("State")); 
    dt.Columns.Add(new DataColumn("Zip")); 
    dt.Columns.Add(new DataColumn("Phone")); 

    dc = new DataColumn(); 
    dc.DataType = typeof(DateTime); 
    dc.ColumnName = "LastPurchaseDate"; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = typeof(int); 
    dc.ColumnName = "CustomerType"; 
    dt.Columns.Add(dc); 

    // Populate the table 
    dt.Rows.Add(2, "Baggins", "Bilbo", "Baggins, Bilbo", "Bagshot Row #1", "Hobbiton", "SH", "00001", "555-2222", DateTime.Parse("24/9/2008"), 1); 
    dt.Rows.Add(1, "Baggins", "Frodo", "Baggins, Frodo", "Bagshot Row #2", "Hobbiton", "SH", "00001", "555-1111", DateTime.Parse("14/9/2008"), 1); 
    dt.Rows.Add(6, "Bolger", "Fatty", "Bolger, Fatty", "ProudFeet Creek", "Hobbiton", "SH", "00001", "555-1111", DateTime.Parse("14/9/2008"), 1); 
    dt.Rows.Add(4, "Elessar", "Aragorn", "Elessar, Aragorn", "Citadel", "Minas Tirith", "Gondor", "00000", "555-0000", DateTime.Parse("14/9/2008"), 4); 
    dt.Rows.Add(5, "Evenstar", "Arwin", "Evenstar, Arwin", "Citadel", "Minas Tirith", "Gondor", "00000", "555-0001", DateTime.Parse("23/9/2008"), 4); 
    dt.Rows.Add(3, "Greyhame", "Gandalf", "Grayhame, Gandalf", DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, 3); 

    DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn(); 

    List<CustomerType> customerTypes = new List<CustomerType> { new CustomerType { Id = 1, Name = "Good" }, new CustomerType { Id = 4, Name = "Bad" }, new CustomerType { Id = 3, Name = "Ugly" } }; 

    cboCategory.HeaderText = "Customer Type"; 
    cboCategory.DataSource = customerTypes; 
    cboCategory.DisplayMember = "Name"; 
    cboCategory.ValueMember = "Id"; 
    cboCategory.DataPropertyName = "CustomerType"; 

    dataGridView1.Columns.Add(cboCategory); 

    dataGridView1.DataSource = dt; 

} 

在那里的绒毛位 - 从网页中抓取了可数据表的代码。但是关键部分是组合框列的属性设置。

我的数据源是customertype对象的列表:

public class CustomerType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

所以我需要设置DisplayMember在列“名称”和ValueMember为“ID”,因为这引用的列数据源。 但是,DataPropertyName的被设置为“CustomerType”的值,这是DataTable中绑定到DataGridView的列的名称。


所以在聊天讨论一丁点后,原来上面是真的,但你还需要确保你的类型ID列的匹配。

用于提供数据到ComboBox列中的数据表是从SQL查询生成并具有在型的id列你的背衬的数据表已经id列由像这样:

dt.Columns.Add(new DataColumn("Category")); 

缺省为一个字符串类型的列。尝试,而不是像这样:

downtimeEntries.Columns.Add("Category", typeof(int));