【问题标题】:c# Show datagridview column's distinct value in combobox itemc#在组合框项中显示datagridview列的不同值
【发布时间】:2014-12-13 00:52:08
【问题描述】:

在运行时,我将 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();

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

【问题讨论】:

    标签: c# winforms entity-framework datagridview combobox


    【解决方案1】:
    dgvLoadTable[col, row].ValueType = typeof(var); 
    

    这是错误的。请将其忽略或使其成为数据的类型,而不是其集合!第 2 列和第 4 列中有哪些数据类型?

    对于字符串或整数,你可以写

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

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

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

    但是发现改变单元格后需要恢复数值;所以整段代码应该是这样的:

      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 子句,以确保没有空值潜入..

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

    【讨论】:

    • DataGridViewComboBoxCell 值无效时抛出异常。
    • 那么,列中有哪些数据类型??
    • 我修复了异常,但组合框项目中没有显示任何内容。数据类型不固定,因列而异
    • ((DataGridViewComboBoxCell)dgvLoadTable[col, row]).Items.AddRange(item.ToArray()); 上放一个断点,然后查看item!有数据吗??
    • 如有必要,您应该为这些列使用正确的 valueType。我们只讨论 #2 和 #4!.. 但也许您可以完全不设置 valuetype!
    猜你喜欢
    • 2013-12-08
    • 2011-10-10
    • 2014-09-23
    • 2013-08-05
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多