我将ArrayList()绑定到Listbox控件,并为Array中的数据分配Displaymember和Value。我的问题是我在启动时绑定但是在几次函数调用后数组被填充。我在selectedIndexChanged上有代码来检查selectedValue,但是如果ArrayList是空的,它返回一个对象,一旦它有数据,它就会返回我期望的字符串。我仍然感到困惑,为什么当列表没有数据时它运行selectedIndexChanged。认为它可能在我绑定Displaymember之后但在赋值之前运行:
lbCAT_USER.DataSource = USERS;
// Running here maybe?
lbCAT_USER.DisplayMember = "DisplayString";
// Or Here?
lbCAT_USER.ValueMember = "ID";
无论哪种方式,我当前的解决方法是将SelectedValue与字符串进行比较并尝试重新运行该函数的try / catch。
简单的解决方法可能是在if语句之前检查数据类型的方法吗?任何建议的想法都可能非常有用。感谢
答案 0 :(得分:10)
您有两种方法可以检查:
string value = list.SelectedValue as string;
// The cast will return null if selectedvalue was not a string.
if( value == null ) return;
//Logic goes here.
如果您只是想进行比较:
if( list.SelectedValue is string )
{
// ...
}
答案 1 :(得分:1)
如果您的问题是如何通过if-condition(标题!)检查值的数据类型,那么请转到(例如:检查值是否为'string'类型):
if(value.GetType().Equals(typeof(string)))
{
...
}
编辑:这不是最干净的方法。检查Guard的答案,了解更复杂的检查类型的方法。使用'GetType()。等于'比'is'或'as'更精确,因为'value'必须与'string'类型完全相同。 'is'和'as'即使'value'是checked类型的子类也能工作。这与“type”类型进行比较时无关紧要,因为您无法从字符串继承。
答案 2 :(得分:0)
处理value为null的情况:
if (typeof(value) == typeof(string))
{
...
}
答案 3 :(得分:0)
我相信你也可以使用:
if (value is string)
{
}
检查C#中变量的类型。
答案 4 :(得分:0)
是的,他们都调用OnSelectedIndexChanged()事件
你可以通过在OnSelectedIndexChanged处理程序上放置断点并单步执行来检查这一点。
执行数据绑定时,可以取消挂钩OnSelectedIndexChanged事件
this.ListBox.SelectedIndexChanged -= OnSelectedIndexChangedHandler;
this.ListBox.DataSource = dataSource;
this.ListBox.ValueMember = "ID"
this.ListBox.DisplayMember = "Name"
this.ListBox.SelectedIndexChanged += OnSelectedIndexChangedHandler;
或者只是检查其他人在OnSelectedIndexChanged事件中建议的值。
两者都不能伤害