关于ComboBox SelectedIndex 及相关属性、事件的奇怪问题,千古奇案啊!
sxbyl 2004-02-13 02:47:09 我有一个指定了DataSource的ComboBox,DisplayMember和ValueMember也都设置好了,其他工作也很正常,但是设置SelectedIndex和响应TextChanged、SelectedValueChanged等事件时却出现了问题。
1、先说SelectedIndex,设置SelectedIndex = -1有时无法取消当前选择项。
在我的一个文本编辑框TextChanged响应函数中,我有下面几行代码:
Int64 id = -1;
try
{
id = Int64.Parse(editTypeID.Text);
}
catch(Exception)
{
}
DataRow[] rows = _dsBaseData.Tables["WorkTypes"].Select(string.Format("TypeID = {0}", id));
if(rows.Length == 0)
{
cbTypeName.SelectedIndex = -1; //光这行还不行??
cbTypeName.SelectedItem = null; //光这行也不行??
}
else
{
cbTypeName.SelectedValue = rows[0]["TypeGuid"];
}
上面代码中cbTypeName就是那个ComboBox。
问题就出在rows.Length == 0的情况下。按照MSDN中的说法,我只要设置SelectedIndex =-1,那么ComboBox就会deselect当前选择的项,但我发现有时这个不管用,在Watch窗口中看cbTypeName的属性,发现在执行cbTypeName.SelectedIndex = -1后,cbTypeName的私有成员selectedIndex倒是成了-1了,但是SelectedIndex属性仍然是0,即选择了列表中的第一项,这两个不统一,而实际界面中也确实还是第一项的值。只有再调用一次cbTypeName.SelectedItem = null,selectedIndex 和SelectedIndex才会统一为-1,这是怎么搞的?
2、再说ComboBox 的 TextChanged、SelectedValueChanged等事件
我发现这些东西也有问题。最简单的TextChanged事件,我如果直接在界面上操作ComboBox而导致选择项发生变化,TextChanged事件居然不被引发,而MSDN上写着This event is raised if the Text property is changed by either a programmatic modification or user interaction.
再看SelectedValueChanged事件,MSDN中说Occurs when the SelectedValue property changes,而如果我在程序中执行了cbTypeName.SelectedValue = rows[0]["TypeGuid"],那个事件也没有被引发,难道MSDN中说的SelectedValue property changes不包括用户代码设置SelectedValue 引发的事件?