datagridview里面的DataGridViewComboBoxColumn
请教各位高人,本人想在datagridview里加一个DataGridViewComboBoxColumn和2个textbox,DataGridViewComboBoxColumn里面有货品名称,当选择好一个货品后,在另外2个textbox里显示该货品的规格和单位,但好像实现起来有些问题,不知道这里高人有做过类似的项目吗? 问题点数:60、回复次数:11Top
1 楼gaojincool(高进)回复于 2006-12-26 23:25:56 得分 0
我也在求问啊,顶Top
2 楼jointan()回复于 2006-12-27 00:07:05 得分 30
以下代码通过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);
}
}
Top
3 楼sdl2005lyx()回复于 2006-12-27 09:21:12 得分 0
lz:
解决问题的关键是:在datagridview控件的列值或单元格事件里(CellValueChanged ),根据动态从combox控件里选择的值,动态填充同行的“规格”和“单位“两列的单元格的值。
Top
4 楼cinray()回复于 2006-12-27 09:22:30 得分 0
Ding
Top
5 楼llyzcy(计算机辅助化工设计)回复于 2006-12-27 12:30:14 得分 0
upTop
6 楼panyijun()回复于 2006-12-27 13:19:18 得分 0
有一段代码可以实现,但存在一个很大的问题
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;
}
Top
7 楼panyijun()回复于 2006-12-27 15:50:02 得分 0
dingTop
8 楼KJ_Wang(Java Every Day)回复于 2006-12-27 15:53:59 得分 30
你的思路肯定没错,彼人也是这么做的。
好像你这个错了((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem
ComboBox换成DataGridComBoxCell好象这个吧。这样就可以实现。
总之,你的思路没错。Top
9 楼panyijun()回复于 2006-12-27 16:12:32 得分 0
谢谢楼上的指导,我的意思是我在做调试的时候加了一个MessageBox.Show("111");语句,发现这个对话框会随着行的增加弹出来的次数也会翻倍,如果我把这个语句换成其他读取数据库的语句的话,我每次从下拉框里选一个值,那么这个读取数据库的语句就会执行n*2次,我的问题就在这里,很头疼,不考虑这个功能可以实现,但我觉得这个应该可以解决,还希望这个大家帮我想想办法Top
10 楼panyijun()回复于 2006-12-27 16:33:33 得分 0
在顶一下
Top
11 楼panyijun()回复于 2006-12-27 19:28:13 得分 0
使劲顶一下Top




