如何使用ComboBox从两个表中填充DataGridView

时间:2014-10-20 16:53:31

标签: c# datagridview

我有以下两个表格:

| Part_id  |   Name  |Part_Type| 
|----------|---------|---------|
|    1     |   ABC   |   Nut   | 
|    2     |   DEF   |   Nut   |
|    3     |   GHI   |  Washer |

|   Type   |   
|----------|  
|   Nut    |
|  Screw   |
|  Washer  |

如何填写DataGridView,如下所示:

| Part_id  |   Name  |     Part_Type     | 
|----------|---------|-------------------|
|    1     |   ABC   |   Nut(combobox)   | 
|    2     |   DEF   |   Nut(combobox)   |
|    3     |   GHI   |  Washer(combobox) |

在Part_Type列上使用每个类型的组合框,以便用户可以更改特定部分的类型?

这就是我所拥有的:

string myCmdText = "SELECT * FROM Parts";
MySqlCommand myQuery = new MySqlCommand(myCmdText, myConnection);
using (MySqlDataAdapter myAdapter = new MySqlDataAdapter(myQuery))
{
    DataSet DS = new DataSet();
    myAdapter.Fill(DS);
    myDataGridView.DataSource = DS.Tables[0];
}

我尝试将DataGridView的Part_Type字段单元格转换为ComboBoxCells并手动添加缺少的部分类型,但我收到了invalidcastexception。

有没有办法做到这一点,最好比我试过的更容易?

1 个答案:

答案 0 :(得分:0)

要使用下拉单元格类型,您需要做两件事:

  • 创建DataGridViewComboBoxCell
  • 类型的单元格
  • 使用适当的数据填写

创建下拉单元格

您必须创建所有Columns作为您希望它们在代码中的类型,而不是使用自动列生成。设置myDataGridView.AutoGenerateColumns = false;这需要在 发出查询之前完成,因为您以后无法更改列类型。

但是有一个解决方法:为了以后更改类型,您需要交换每个 Cell您希望特殊的类型,针对该类型的单元格你要。注意:这是关于单元格而不是列,所以你需要遍历所有行,就像我在下面的代码中所做的那样!

使用适当的数据填写:

您可以a)使用DataBinding:

  • 为ComboBoxCells设置Datasource,通常为第二个表中的查询;但您也可以将它们设置为与第一个查询结果或其他来源不同的选择..
  • 设置DisplayMember& ValueMember(在您的情况下是同一个字段。)

或者你b)可以用未绑定数据填充Items集合。

您可以使用以下内容:

string myCmdText = "SELECT * FROM Parts";
string myCmdText2 = "SELECT * FROM Types";
int yourDropdownIndex = 2;
MySqlCommand myQuery = new MySqlCommand(myCmdText, myConnection);
MySqlCommand myQuery2 = new MySqlCommand(myCmdText2, myConnection);
using (MySqlDataAdapter myAdapter = new MySqlDataAdapter(myQuery))
using (MySqlDataAdapter myAdapter2 = new MySqlDataAdapter(myQuery2))
{
    DataSet DS = new DataSet();
    DataTable DT2 = new DataTable();
    myAdapter.Fill(DS);
    myAdapter2.Fill(DT2);
    DS.Tables.Add(DT2);
    myDataGridView.DataSource = DS.Tables[0];
    foreach (DataGridViewRow row in myDataGridView.Rows)
    {
        var temp = row.Cells[yourDropdownIndex].Value;
        DataGridViewComboBoxCell comboCell = new DataGridViewComboBoxCell();
        comboCell.DisplayMember = "type";
        comboCell.ValueMember = "type";
        comboCell.DataSource = DS.Tables[1];
        row.Cells[yourDropdownIndex] = comboCell;
        row.Cells[yourDropdownIndex].Value = temp;
    }
}

如有必要,您现在可以将Cell转换为DataGridViewComboBoxCell

int ddlCount = ((DataGridViewComboBoxCell) 
                 myDataGridView.Rows[row].Cells[yourDropdownIndex]).Items.Count;

您可能希望在班级级别声明DataSet DS