簡體   English   中英

c#在組合框項目中顯示datagridview列的不同值

[英]c# Show datagridview column's distinct value in combobox item

在運行時,我將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();

但這是行不通的,有什么建議嗎?

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

錯了 請要么忽略它,要么使其成為數據類型,而不是其集合! 第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子句,以確保沒有空值潛入。

請注意事情的順序:首先我們存儲值,然后更改單元格,然后恢復值,最后我們填充組合框項!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM