数据网格数据来自数据库的数据,其中一个单元格是组合框c#

时间:2014-12-03 21:08:39

标签: c# datagridview combobox

我有一个数据网格视图,我需要填充数据库中的内容。 我的数据库内容位于数据表中,通常如下所示:

产品产品名称版本

1 abc 1.1

1 abc 2.1

1 abc 3.1

2 def 3.1

2 def 3.2

3 ghi 1.1

4 jkl 1.1

4 jkl 1.2

现在我的问题是,当我在数据网格视图中显示内容时,我希望它显示为这样,其中版本应该是下拉组合框,因此每个产品都有一个版本列表:

产品产品名称版本

1 abc 1.1

    2.1

    3.1

2 def 3.1

    3.2

3 ghi 1.1

4 jkl 1.1

    1.2

请帮助我实现这一目标。我不能直接说:
dataGridView1.DataSource = getdatatable()

所以请不要建议,因为它给我一个没有组合框的平面视图。热切期待积极的回复。是否可以在数据网格视图中绘制每一行并使用产品可用的所有版本填充该行中的组合框?请帮忙。 TIA

1 个答案:

答案 0 :(得分:3)

基本上,您需要对查询数据进行排序,并使用所有版本的列表保存每个唯一产品。然后,您将手动创建DataGridView的列,如下所述。

为了模拟这个场景,我创建了以下对象类:

// The type of binding object for your dgview source.
public class Product
{
  public Product()
  {
    this.Version = new List<double>();
  }

  public int ID { get; set; }
  public string Name { get; set; }
  public List<double> Version { get; set; }
}

在你的查询中返回所有对象,我会做这样的事情:

public BindingList<Product> YourQueryCall()
{
  BindingList<Product> products = new BindingList<Product>();

  /*
   *  Your code to query the db.
   */

  while reader.Read()
  {
    Product existingProduct = new Product();

    int id = // value from the reader
    string name = // value from the reader
    double version = // value from the reader

    try
    {
      existingProduct = products.Single(p => p.ID == id && p.Name == name);
      existingProduct.Version.Add(version);
    }
    catch // No product yet exists for this id and name.
    {
      existingProduct.ID = id;
      existingProduct.Name = name;
      existingProduct.Version.Add(version);
      products.Add(existingProduct);
    }
  }

  return products;
}

这将只存储唯一的产品及其版本列表。在表单中,显示ComboBoxColumn中每行的唯一版本列表:

public Form1()
{
  InitializeComponent();

  this.Products = YourQueryCall();
  this.FillDGView();
}

public BindingList<Product> Products { get; set; }

public void FillDGView()
{
  DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn();
  col1.Name = "Product ID";
  col1.ValueType = typeof(int);
  dataGridView1.Columns.Add(col1);

  DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn();
  col2.Name = "Product Name";
  col2.ValueType = typeof(string);
  dataGridView1.Columns.Add(col2);

  DataGridViewComboBoxColumn col3 = new DataGridViewComboBoxColumn();
  col3.Name = "Version";
  col3.ValueType = typeof(double);
  dataGridView1.Columns.Add(col3);

  for (int i = 0; i < this.Products.Count; i++)
  {
    DataGridViewRow row = (DataGridViewRow)(dataGridView1.Rows[0].Clone());

    DataGridViewTextBoxCell textCell = (DataGridViewTextBoxCell)(row.Cells[0]);
    textCell.ValueType = typeof(int);
    textCell.Value = this.Products[i].ID;

    textCell = (DataGridViewTextBoxCell)(row.Cells[1]);
    textCell.ValueType = typeof(string);
    textCell.Value = this.Products[i].Name;

    DataGridViewComboBoxCell comboCell = (DataGridViewComboBoxCell)(row.Cells[2]);
    comboCell.ValueType = typeof(double);
    comboCell.DataSource = this.Products[i].Version;
    comboCell.Value = this.Products[i].Version[0];

    dataGridView1.Rows.Add(row);
  }
}

希望这有帮助!