项目是在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 else 38 { 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 else 50 { 51 i_Enable=1; 52 break; 53 } 54 } 55 else 56 { 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 else 67 { 68 cbo_Test.Enable=false; 69 cbo_Test.SelectedIndex=0; 70 } 71 } 72 }
由于使用的是EditingControlShowing事件,所以第一次点击会传一个空值,导致cbo_Test的值被清空。
为了解决这个问题,采用了一个全局变量来记录这个值,也就是相当于重新赋了一遍值,会闪一下。
有点遗憾......
不过,毕竟算是解决了问题,而且DataGridView中的二级联动也可以根据这个来实现。
所以,这个方法虽然不够完美,但应该还是有点儿参考价值的#^_^#~~~