如何在DataGridView中的ComboBox列的下一行中添加不同的数据

时间:2014-06-13 14:51:15

标签: c#

我有一个场景,其中我有MS SQL服务器数据库一个表名称项目和另一个表名称项目大小和另一个表名称大小数量。意思是说我的产品有一个项目,每个项目都有一个尺寸,每个尺寸都有自己的数量,

制作发票时我想要一个网格视图,它会显示项目列表,用户将选择一个项目并插入到下一个网格视图中,我有一个组合框,它将加载项目的大小,如您所知item有不同的大小,所以我想在每行中以不同的方式显示它们,以便用户不会混合两种产品大小

1 个答案:

答案 0 :(得分:0)

每行可以有不同的dataSource。我建议你使用DataTables - 它们中的每一个都将用于特定的行(因此它们可以组合成一组DataSet)。 一个例子(不使用DataSet),但每行都有自己的dataSource:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        //column 1 (normal textColumn):
        dataGridView1.Columns.Add("col1", "Column1");
        //column 2 (comboBox):
        DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn();
        comboCol.Name = "cmbColumn";
        comboCol.HeaderText = "combobox column";
        dataGridView1.Columns.Add(comboCol);

        for (int i = 0; i < 10; i++)
        {
            string text = "item " + i;
            int[] data = { 1 * i, 2 * i, 3 * i };
            CreateCustomComboBoxDataSouce(i, text, data);
        }
    }

    private void CreateCustomComboBoxDataSouce(int row, string texst, int[] data) 
    //row   index        ,and two parameters
    {
        dataGridView1.Rows.Add(texst);
        DataGridViewComboBoxCell comboCell = dataGridView1[1, row] 
        as  DataGridViewComboBoxCell;
        comboCell.DataSource = new BindingSource(data, null);
    }
}

我通过使用DataSet(多个dataTables)解决了另一个解决方案,并且因为DataSet是类变量,它包含所有DataTables - 如果你可能需要来自特定dataTable的某些值,你可以很容易地得到它。

  DataSet ds; //class variable
    public Form1()
    {
        InitializeComponent();

        ds = new DataSet();
        //column 1 (normal textColumn):
        dataGridView1.Columns.Add("col1", "Column1");
        //column 2 (comboBox):
        DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn();
        comboCol.Name = "cmbColumn";
        comboCol.HeaderText = "combobox column";
        dataGridView1.Columns.Add(comboCol);

        //using dataTable for each datasource:             
        for (int i = 0; i < 10; i++)
        {
            string text = "item " + i; //data for text
            int[] data = { 1 * i, 2 * i, 3 * i }; //data for comboBox:

            //create new dataTable:
            DataTable table = new DataTable("table" + i);
            table.Columns.Add("column1", typeof(string));

            //fillig rows:
            foreach (int item in data)
                table.Rows.Add(item);

            //add table to dataSet:
            ds.Tables.Add(table);

            //creating new row in dgv (text and comboBox):
            CreateCustomComboBoxDataSouce(i, text, table);
        }
    }

    private void CreateCustomComboBoxDataSouce(int row, string texst, DataTable table)
     //row index ,and two parameters
    {
        dataGridView1.Rows.Add(texst);
        DataGridViewComboBoxCell comboCell = dataGridView1[1, row] as
        DataGridViewComboBoxCell;
        comboCell.DataSource = new BindingSource(table, null);
        comboCell.DisplayMember = "column1"; //name of column indataTable to display!!
        comboCell.ValueMember = "column1"; // vlaue if needed 
        //(mostly you used these two propertes like: Name as DisplayMember, and Id 
        as ValueMember)
    }