c#在组合框项目中显示datagridview列的不同值

时间:2014-10-17 12:26:44

标签: c# winforms entity-framework datagridview combobox

在运行时我将datagridview的一些列更改为组合框列。现在我如何获得组合框项目中现有的不同值?我使用实体模型作为数据源。我的代码是:

dgvLoadTable.DataSource = null;
var context = new AdminEntities();
var TableName = cboSelectTable.Text.ToString();
var rawData = context.GetType().GetProperty(TableName)
                               .GetValue(context, null);
var truncatedData = ((IQueryable<object>)rawData).Take(0);
var source = new BindingSource { DataSource = truncatedData };
dgvLoadTable.DataSource = source;
dgvLoadTable.ReadOnly = false;
dgvLoadTable.AllowUserToAddRows = true;

for (int row= 0; row < dgvLoadTable.Rows.Count; row++
{
  for (int col = 0; col < dgvLoadTable.Columns.Count; col++)
  {
    if (col == 2 || col == 4)
    {
      this.dgvLoadTable[col, row] = new DataGridViewComboBoxCell();

      var item = dgvLoadTable.Rows.Cast<DataGridViewRow>()
                                  .Where(r => r.Cells[0].Value != null)
                                  .Select(r => r.Cells[col].Value)
                                  .Distinct();
      ((DataGridViewComboBoxCell)dgvLoadTable[col,row]).Items
                                                       .AddRange(item
                                                                .ToArray());
      dgvLoadTable[col, row].ValueType = typeof(var);
    }
  }
}                             
dgvLoadTable.Refresh();

但这不起作用,有什么建议吗?

1 个答案:

答案 0 :(得分:0)

dgvLoadTable[col, row].ValueType = typeof(var); 

这是错误的。请将其保留或将其作为数据类型,而不是其集合!第2列和第2列中的数据类型是什么。 4?

您可以编写的字符串或整数

dgvLoadTable[col, row].ValueType = typeof(string);

dgvLoadTable[col, row].ValueType = typeof(int);

但是:您可能不需要控制数据类型,因为它是使用列生成的,并且您有onyl更改列类型,而不是值类型。

然而我发现更改单元格后需要恢复值;所以整段代码应该是这样的:

  for (int row= 0; row < dgvLoadTable.Rows.Count; row++)
  {
    for (int col = 0; col < dgvLoadTable.Columns.Count; col++)
    {
      if (col == 2 || col == 4)
      {
        var temp = dgvLoadTable[col, row].Value;
        this.dgvLoadTable[col, row] = new DataGridViewComboBoxCell();
        dgvLoadTable[col, row].Value = temp;

        var items = dgvLoadTable.Rows.Cast<DataGridViewRow>()
                   .Where(r => r.Cells[0].Value != null)
                   .Where(r => r.Cells[col].Value != null)
                   .Select(r => r.Cells[col].Value)
                   .OrderBy(r => r).Distinct();

        ((DataGridViewComboBoxCell) dgvLoadTable[col, row])
                                   .Items.AddRange(items.ToArray());


       }
    }
 }                             
 dgvLoadTable.Refresh();

除此之外我们的代码工作正常,前提是您有item中的数据。

如果列中有数据,它将包含所有这些不同的值。我添加了一个可选的排序和一个额外的where子句,以确保没有空值爬行..

请注意事项的顺序:首先我们存储值,然后更改单元格,然后恢复值,最后我们填充组合框项目!