谁都知道System.Windows.Forms命名空间下的ListControl类有两个这样的属性:
ListControl.DisplayMember 和 ListControl.ValueMember 。
这两个属性用来指定listControl绑定的对象中的什么属性用于它的显示,对象中的什么属性用于它的value值。
最常用的方式当然是指定ListControl的DataSource到如从数据来的table;或者构建的 List<object>,然后指定这DisplayMember供用户使用,指定其ValueMember 供程序使用。
从listControl继承来的控件就很多了,如ListBox,ComboBox等等,这些控件都能提供绑定到对象集合的功能。DisplayMember和ValueMember构成了一个键值对的关系,我们在应该中也经常只需要绑定到只有键和值的对象上,当然这里的键通常就是字符串或者数字,而值却可以是各种object对象了。
今天这里要说的不是这个控件的使用,而是想说如何跟微软学习的问题。
很简单的应用,就是让ComBoBox绑定到一个键值的对对象集合上,通过Dislay的值,得到其Value。
KeyValuePair<(Of <(TKey, TValue>)>) Generic Structure ,系统提供了一个keyValuePair的泛型类型,没错,可以用上它了。的却,只用于绑定和选择操作是完全ok的,但是应为ComBoBox的Item是object类型的,不是一个确定类型的东东,把KeyValuePair的Structure绑定上去之后,就没法对其进行逆操作了,知道选择的Item,但是不能操作Item,Item不能转换到KeyValuePair的Structure,对象不能as为结构体。
这就是问题,系统给提供的KeyValuePair的Structure 不能用于绑定后进行操作了,比如我们要比较Item的value。这就逼迫我们绑定到控件的必须是对象,这样就可以进行Item as Class的操作了。
我们发现只要创建一个和KeyValuePair<(Of <(TKey, TValue>)>) Generic Structure结构完全一样的类就可以满足我们的需求了。
接下来就是写代码了,怎么创建这个泛型类呢?代码怎么写呢?
简单,我们抄袭微软的代码,或者说跟微软学习加就好了。
用reflector来查看下KeyValuePair<(Of <(TKey, TValue>)>) Generic Structure的代码,直接把Structure改成class不就ok了。
我们把代码copy出来,改成class,如下:
代码
public
Class KeyValuePair
<
TKey, TValue
>
{
private
TKey key;
private
TValue value;
public
KeyValuePair(TKey key, TValue value)
{
this
.key
=
key;
this
.value
=
value;
}
public
TKey Key
{
get
{
return
this
.key;
}
}
public
TValue Value
{
get
{
return
this
.value;
}
}
public
override
string
ToString()
{
StringBuilder builder
=
new
StringBuilder();
builder.Append(
'
[
'
);
if
(
this
.Key
!=
null
)
{
builder.Append(
this
.Key.ToString());
}
builder.Append(
"
,
"
);
if
(
this
.Value
!=
null
)
{
builder.Append(
this
.Value.ToString());
}
builder.Append(
'
]
'
);
return
builder.ToString();
}
}
有需要的话,改改ToString方法,就over了,这样就完成这个键值对的类的创建了。怎么样?这样的代码质量如何,这样的代码写起来快吧,这样的代码可读性好吧。哈哈,没事还是多多选择跟微软学习,不要苦苦追寻什么高人了,高人就在身边。
下面看看怎么用这个东东了。
加入我们需要在ComBoBox的selectIndexChange事件里检测选择的项目的Value是否是预期想要的。
代码
//
类
class
ClassA
{
private
string
name;
public
string
Name;
public
ClassA(
string
name)
{
this
.Name
=
name;
}
}
ComboBox cbx
=
new
ComboBox();
cbx.DataSource
=
List
<
KeyValuePair
<
string
,ClassA
>>
()
{
new
KeyValuePair
<
string
, ClassA
>
(
1
,
new
ClassA(
"
abc1
"
));
new
KeyValuePair
<
string
, ClassA
>
(
1
,
new
ClassA(
"
abc2
"
));
new
KeyValuePair
<
string
, ClassA
>
(
1
,
new
ClassA(
"
abc3
"
));
new
KeyValuePair
<
string
, ClassA
>
(
1
,
new
ClassA(
"
abc4
"
));
new
KeyValuePair
<
string
, ClassA
>
(
1
,
new
ClassA(
"
abc5
"
));
}
cbx.DisplayMember
=
"
key
"
;
cbx.ValueMember
=
"
value
"
;
cbx.SelectedIndexChanged
+=
cbx_SelectedIndexChanged;
private
void
cbx_SelectedIndexChanged(
object
sender, EventArgs e)
{
KeyValuePair
<
string
,ClassA
>
obj
=
cbx.SelectedItem
as
KeyValuePair
<
string
,ClassA
>
;
//
自定义的class:keyValuePair
if
(obj.Value.Name
==
"
abc1
"
)
MessageBox.show(
"
ok
"
);
}