请教各位高人,本人想在datagridview里加一个DataGridViewComboBoxColumn和2个textbox,DataGridViewComboBoxColumn里面有货品名称,当选择好一个货品后,在另外2个textbox里显示该货品的规格和单位,但好像实现起来有些问题,不知道这里高人有做过类似的项目吗?
解决方案 »
- win7下,怎么屏蔽自动最大化
- 单元测试的问题
- 怎么编程实现项目的添加操作?
- 用update更新数据表的问题
- c#2005中怎么添加oleDbConnection
- 图片存入数据库后再读出显示,出现奇怪错误
- 请高手解决问题.解决不了我要失业了!(在中文系统.net2003里面编译好的系统,放在英文版xp中运行)
- 怎样实现QQ中的好友上线即时刷新好友列表那样的功能?
- 高手解答: using System.Web.Mail; 出错了。
- 在winform程序里用了文本编辑器,但无法给文本编辑器赋值。
- 请教有关弹出快捷菜单的问题,欢迎赐教、关注,大家共同提高!!!!
- 问: 在WinForm应用程序中如何处理数据库连接
{
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);
}
}
解决问题的关键是:在datagridview控件的列值或单元格事件里(CellValueChanged ),根据动态从combox控件里选择的值,动态填充同行的“规格”和“单位“两列的单元格的值。
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;
}
好像你这个错了((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem
ComboBox换成DataGridComBoxCell好象这个吧。这样就可以实现。
总之,你的思路没错。