CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

datagridview里面的DataGridViewComboBoxColumn

楼主panyijun()2006-12-26 23:13:51 在 .NET技术 / C# 提问

请教各位高人,本人想在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

相关问题

关键词

得分解答快速导航

  • 帖主:panyijun
  • jointan
  • KJ_Wang

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo