Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2347170
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2006-08-14 14:45:05

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().

阅读(2891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~