ComboBox, ListBox 中每个元素都对应一个对象, 默认情况下, 显示给用户看到的字串信息就是 这个对象的ToString()方法返回的信息.
但是, 当对象被修改, 从而使得ToString()返回值也需要更新时, 却没有一个方便的方法来实现. 控件获取显示字串的时机是Add/AddRange 调用时.
使用数据绑定的方法可以在更新绑定数据的同时自动更新显示字串. 这一方法我却从来没试过.
对于手工添加对象的应用来说, 可以用下面的方法来实现:
comboBox1.Items[2] = comboBox1.Items[2];
从字面的语意看似乎是一个什么也没做的语句. 但.NET中index是实现为一段代码的, 这样实际上对该元素重新进行了赋值.
但这样的语句的确对第一次读程序的人增加了困难. 可以用下面的代码来在一个项目中隐藏.NET的这一个小的tricks:
public static void refresh_item(IList list, object obj)
{
if( list == null) return ;
int idx = list.IndexOf( obj );
if( idx < 0) return;
list[idx] = obj;
}
调用的时候需要
refresh_item( combox1, comboBox1.Items[2]);
因为参数是IList接口, 所以不论是ComboBox还是ListBox 都可以.
下面的方法不可以:
refresh_item(object obj)
{
obj = obj;
}
refresh_item( ref comboBox1.Items[2] );
会报告编译错误: 不能对indexer 属性使用ref或out
如果改成
object obj = comboBox1.Items[2];
refresh_item(ref obj);
也仍然不可以, 原因还是未经对[]indexer 赋值则不能触发重新计算对象的ToString().
阅读(2924) | 评论(0) | 转发(0) |