首页 > 代码库 > 2014-07-30 DataGridView单元格ComboBox控件Index

2014-07-30 DataGridView单元格ComboBox控件Index

项目是在DataGridView单元格中搞得ComboBox控件。

而且要根据ComboBox对应的不同选项,来确定界面上的另一个ComboBox控件是否可用。

 

这样问题就出来了:

DataGridView中的ComboBox是没有事件的!

当更改了Combox中的值以后,必须用鼠标点一下别的地方(鼠标离开此单元格),才会走CellValueChanged事件...... 

 

研究+百度了好久,都不行,终于在中午灵光一闪,搞定了!

 

思路就是把这个没有事件的单元格,变成有事件的控件:

 1 //定义全局变量。 2 int i_Enable; 3 int i_Index; 4  5 //给界面上的ComboBox控件注册Leave事件。 6 private void cbo_Test_Leave(~~~) 7 { 8         i_Index=cbo_Test.SelectedIndex; 9 }10 11 //给DataGridView注册CellClick事件。12 private void dgv_Test_CellClick(~~~)13 {14         i_Index=cbo_Test.SelectedIndex;15 }16 17 //给DataGridView注册EditingControlShowing事件。18 private void dgv_Test_EditingControlShowing(~~~)19 {20         if(this.dgv_Test.CurrentCell.OwningColumn.Name="col_Test")21         {22                ((ComboBox)e.Control).SelectedIndexChanged+=new EventHandler(ComboBox_SelectedIndexChanged);23         }24 } 25 26 //定义ComboBox_SelectedIndexChanged事件。27 private void ComboBox_SelectedIndexChanged(~~~)28 {29         string str=((ComboBox)sender).Text.Trim();30         DataGridViewColumn tmpCol=dgv_Test.CurrentCell.OwningColumn;31         if(tmpCol.Name="col_Test":)32         {33                 if(x=="v_Enable")34                 {35                         i_Enable=1;36                 }37                 else38                 {39                         DataGridViewRow tmpRow=dgv_Test.CurrentCell.OwningRow;40                         for(int i=0;i<dgv_Test.Rows.Count-1;i++)41                         {42                                 if(dgv_Test.Rows[i].Cells["col_Test"].Value!=null&&43                                    dgv_Test.Rows[i].Cells["col_Test"].Value.ToString().Trim()=="3")44                                 {45                                         if(i=tmpRow.Index)46                                         {47                                                 i_Enable=2;48                                         }49                                         else50                                         {51                                                 i_Enable=1;52                                                 break;53                                         }54                                 }55                                 else56                                 {57                                         i_Enable=2;58                                 }59                         }60                 }61                 if(i_Enable==1)62                 {63                         cbo_Test.Enable=true;64                         cbo_Test.SelectedIndex=i_Index;65                 }66                 else67                 {68                         cbo_Test.Enable=false;69                         cbo_Test.SelectedIndex=0;70                 }71         }72 } 

 

由于使用的是EditingControlShowing事件,所以第一次点击会传一个空值,导致cbo_Test的值被清空。

为了解决这个问题,采用了一个全局变量来记录这个值,也就是相当于重新赋了一遍值,会闪一下。

有点遗憾......

 

不过,毕竟算是解决了问题,而且DataGridView中的二级联动也可以根据这个来实现。

所以,这个方法虽然不够完美,但应该还是有点儿参考价值的#^_^#~~~