请教各位高人,本人想在datagridview里加一个DataGridViewComboBoxColumn和2个textbox,DataGridViewComboBoxColumn里面有货品名称,当选择好一个货品后,在另外2个textbox里显示该货品的规格和单位,但好像实现起来有些问题,不知道这里高人有做过类似的项目吗?

解决方案 »

  1.   

    以下代码通过DataTable.ColumnChanged事件实现:public partial class Form1 : Form
        {
           
            public Form1()
            {
                InitializeComponent();            DataSet dataSet = new DataSet();
                
                dataSet.Tables.Add(new DataTable("货品字典"));
                dataSet.Tables["货品字典"].Columns.Add(new DataColumn("货品编号"));
                dataSet.Tables["货品字典"].Columns.Add(new DataColumn("货品名称"));
                dataSet.Tables["货品字典"].Columns.Add(new DataColumn("规格"));
                dataSet.Tables["货品字典"].Columns.Add(new DataColumn("单位"));
                dataSet.Tables["货品字典"].Constraints.Add("PK编号", dataSet.Tables["货品字典"].Columns["货品编号"],true );            dataSet.Tables["货品字典"].Rows.Add(new object[] { "001", "商品甲", "50*100", "千克" });
                dataSet.Tables["货品字典"].Rows.Add(new object[]{"002", "商品乙", "6001", "尺"});            dataSet.Tables.Add(new DataTable("订单明细"));
                dataSet.Tables["订单明细"].Columns.Add(new DataColumn("货品名称"));
                dataSet.Tables["订单明细"].Columns.Add(new DataColumn("规格"));
                dataSet.Tables["订单明细"].Columns.Add(new DataColumn("单位"));
                dataSet.Tables["订单明细"].ColumnChanged += new DataColumnChangeEventHandler(DataSet_ColumnChanged);
                
                BindingSource bindingSource = new BindingSource(dataSet, "订单明细");
                this.dataGridView1.DataSource = bindingSource;
                int displayIndex = dataGridView1.Columns["货品名称"].DisplayIndex;
                this.dataGridView1.Columns.Remove("货品名称");
                
                DataGridViewComboBoxColumn column=new DataGridViewComboBoxColumn();
                column.DataSource = dataSet.Tables["货品字典"];
                column.DisplayMember = "货品名称";
                column.ValueMember ="货品编号";
                column.DataPropertyName = "货品名称";
                column.DisplayIndex = displayIndex;
                column.HeaderText = "货品名称";
                
                this.dataGridView1.Columns.Add(column);
            }      
            private void DataSet_ColumnChanged(object sender,DataColumnChangeEventArgs e)
            {
                if (e.Column.ColumnName  == "货品名称")
                {
                    DataRow row = e.Row.Table.DataSet.Tables["货品字典"].Rows.Find(e.Row[e.Column.ColumnName]);
                    if (row != null)
                    {
                        e.Row["规格"] = row["规格"];
                        e.Row["单位"] = row["单位"];
                    }
                    else
                    {
                        e.Row["规格"] = "";
                        e.Row["单位"] = "";
                    }
                    //强制网格当前编辑行更新值,不知有没有更方好通知DataGridView的方法
                    for(int i=0;i<this.dataGridView1.Columns.Count ;i++)
                        this.dataGridView1.UpdateCellValue(i,this.dataGridView1.CurrentCell.RowIndex);
                }
            }
      

  2.   

    lz: 
        解决问题的关键是:在datagridview控件的列值或单元格事件里(CellValueChanged ),根据动态从combox控件里选择的值,动态填充同行的“规格”和“单位“两列的单元格的值。
       
       
      

  3.   

    有一段代码可以实现,但存在一个很大的问题
    private DataGridView dataGridView1 = new DataGridView();private void AddColorColumn()
    {
        DataGridViewComboBoxColumn comboBoxColumn =
            new DataGridViewComboBoxColumn();
        comboBoxColumn.Items.AddRange(
            Color.Red, Color.Yellow, Color.Green, Color.Blue);
        comboBoxColumn.ValueType = typeof(Color);
        dataGridView1.Columns.Add(comboBoxColumn);
        dataGridView1.EditingControlShowing +=
            new DataGridViewEditingControlShowingEventHandler(
            dataGridView1_EditingControlShowing);
    }private void dataGridView1_EditingControlShowing(object sender,
        DataGridViewEditingControlShowingEventArgs e)
    {
        ((ComboBox)e.Control).SelectedIndexChanged +=
            new EventHandler(ComboBox_SelectedIndexChanged);
    }private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {    MessageBox.Show("111");//第一行选择没有问题,但第2,第3行就有一个问题,这个事件
    会执行很多次,大家可以调试一下,就会发现,我是想当ComboBox的值发生变化时引发这个事件
        ((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem;
    }
      

  4.   

    你的思路肯定没错,彼人也是这么做的。
    好像你这个错了((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem
    ComboBox换成DataGridComBoxCell好象这个吧。这样就可以实现。
    总之,你的思路没错。
      

  5.   

    谢谢楼上的指导,我的意思是我在做调试的时候加了一个MessageBox.Show("111");语句,发现这个对话框会随着行的增加弹出来的次数也会翻倍,如果我把这个语句换成其他读取数据库的语句的话,我每次从下拉框里选一个值,那么这个读取数据库的语句就会执行n*2次,我的问题就在这里,很头疼,不考虑这个功能可以实现,但我觉得这个应该可以解决,还希望这个大家帮我想想办法