调查一个奇怪的系统异常时发现的这个bug,现象就是用户在ComboBox里面选择一项后,程序在SelectIndexChanged 事件中根据用户选择刷新数据时出现错误。跟踪调试后才发现原来是SelectedValue 值和用户选择的Item项不一致。
但是为什么会出现这样奇怪的错误呢?
经过调查发现是因为设置了ComboBox的Sorted属性引起的。
重新的测试代码如下:
1
private
void
comboBox1_SelectedIndexChanged(
object
sender, EventArgs e)
2 {
3 DataRowView drv = comboBox1.SelectedItem as DataRowView;
4 label1.Text = string .Format( " Value: {0} == {1} ? " , comboBox1.SelectedValue, drv.Row[ " ID " ]);
5 }
6
7 private void frmTest_Load( object sender, EventArgs e)
8 {
9 DataTable dt = new DataTable();
10 dt.Columns.Add( " ID " , typeof ( int ));
11 dt.Columns.Add( " Name " , typeof ( string ));
12 dt.Rows.Add( 1 , " f - 1 " );
13 dt.Rows.Add( 2 , " e - 2 " );
14 dt.Rows.Add( 3 , " d - 3 " );
15 dt.Rows.Add( 4 , " c - 4 " );
16 dt.Rows.Add( 5 , " b - 5 " );
17 dt.Rows.Add( 6 , " a - 6 " );
18
19 comboBox1.DataSource = dt;
20 comboBox1.ValueMember = " ID " ;
21 comboBox1.DisplayMember = " Name " ;
22 }
2 {
3 DataRowView drv = comboBox1.SelectedItem as DataRowView;
4 label1.Text = string .Format( " Value: {0} == {1} ? " , comboBox1.SelectedValue, drv.Row[ " ID " ]);
5 }
6
7 private void frmTest_Load( object sender, EventArgs e)
8 {
9 DataTable dt = new DataTable();
10 dt.Columns.Add( " ID " , typeof ( int ));
11 dt.Columns.Add( " Name " , typeof ( string ));
12 dt.Rows.Add( 1 , " f - 1 " );
13 dt.Rows.Add( 2 , " e - 2 " );
14 dt.Rows.Add( 3 , " d - 3 " );
15 dt.Rows.Add( 4 , " c - 4 " );
16 dt.Rows.Add( 5 , " b - 5 " );
17 dt.Rows.Add( 6 , " a - 6 " );
18
19 comboBox1.DataSource = dt;
20 comboBox1.ValueMember = " ID " ;
21 comboBox1.DisplayMember = " Name " ;
22 }
在ComboBox里面选择 a -6 的话,SelectedValue 是 1 。
实际上因为设置了Sorted属性为true。 a - 6 显示在第一个了,也就是说 SelectedIndex 是 1.
通过测试发现, SelectedValue的值 是按照原始DataTable中Row的顺序获取的。
但是通过 SelectedItem 获取的 ID 值是 6 ,这是正确的。所以SelectedItem的赋值还是正确的。
估计这应该是微软的一个bug,但奇怪的是为什么没有两个一起错,而是一个错一个对。
实验环境:
VS2005 Vista .Net Framework 3.5 SP1 v2.0.50727.3074 。
有其它环境的朋友可以试试在其它版本的框架中是否也有同样的bug。