【问题标题】:Trouble using DataGridViewComboboxColumn for input使用 DataGridViewComboboxColumn 进行输入时遇到问题
【发布时间】:2012-02-14 16:33:43
【问题描述】:

我有一个用于数据输入的 datagridview。我以前对所有文本列都这样做过,效果很好。但现在我希望其中一列成为数据绑定组合框,以便用户可以选择选项。当我这样做时,生成的 gridview 的数据源以空行结束(但数量正确)。我错过了什么?

代码如下:

 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);

每次我得到一个行数正确的表格,但所有行都是空的(虽然它们是长行,但数据集可视化器必须滚动以显示整个单元格)。如何找到错误并纠正?

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

【问题讨论】:

  • 您能否提供完整的代码(填充数据表,将其分配给网格的数据源等...)您正在尝试做的事情非常简单,但没有完整的代码很难说你哪里出错了。 (如果您在线,我们可以在聊天中讨论)
  • 另外 - 不清楚 - 但是当你说这些行是空的时你的意思是在数据表中当你尝试在数据输入后检查它时?为什么不绑定到表单级别的数据表,然后直接引用该对象?不知道这个调整是否能解决问题,但它会使代码更干净。
  • 我想通过它聊天,如何邀请你聊天?
  • 只需点击网站顶部的聊天链接 - 我将在 C# 聊天室。

标签: c# winforms datagridview datagridcomboboxcolumn


【解决方案1】:

这是我刚刚编写的一个简单示例项目。

我认为您弄错的关键是DataGridViewComboboxColumnDataPropertyName 属性需要引用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 设置为“Name”,将 ValueMember 设置为“Id”,因为这引用了列数据源。 但是 DataPropertyName 的值被设置为“CustomerType”,这是我们绑定到DataGridView 的DataTable 中的列的名称。


因此,在聊天中进行了一些讨论后,事实证明上述情况是正确的,但您还需要确保您的 id 列的类型匹配。

用于向组合框列提供数据的数据表是从 sql 查询生成的,并且具有 in 类型的 id 列。您的支持数据表的 id 列如下所示:

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

这默认为字符串类型的列。试试类似的东西:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多