昨天前天,都在折腾一个问题,vs2005里面自带的combox(winform)的问题.
这个问题是这样的,我从数据库中读取出表中的数据,每行填充到预设的类中,再把这些类数据,填充到这个类的集合中,然后combox的dataSouce指向这个类集合.然后设置这个combox的显示和值为其名称属性和编号属性.
这样没有问题.
但当我在combox的SelectedIndexChanged事件中写了获取当前combox的已选择的类的编号属性的时候,发现总在报错.
找了半天原因,才发现:
combox的SelectedIndexChanged事件,在datasouce指定的时候就被触发了,这时候数据还没有绑定好,自然会报错.
我认为这是不合理的.SelectedIndexChanged不应该在绑定数据的中间被触发.
我最后解决办法是设置了一个标志符isLoaded,bool类型,在填充方法完毕后,设为true.允许SelectedIndexChanged被触发.
代码如下:
///
<summary>
///
绑定cmbdoc数据的方法
///
</summary>
private
void
FillCmbDoc()
{
//
新建文档类的集合
Class.ClassDocCollection items1
=
new
DocAddin.Class.ClassDocCollection();
//
提取所有文档数据,填充到集合
items1.FillInAllDoc();
cmbDoc.DataSource
=
items1;
cmbDoc.DisplayMember
=
"
S名称
"
;
cmbDoc.ValueMember
=
"
I编号
"
;
//
设置标志符,true说明该combox已经绑定好了,允许SelectedIndexChanged事件被触发了.
isLoaded
=
true
;
}
private
void
cmbDoc_SelectedIndexChanged(
object
sender, EventArgs e)
{
//
如果绑定完毕,并且选择的不为空
if
(cmbDoc.SelectedItem
!=
null
&&
isLoaded
==
true
)
{
//
获得文档类的编号
int
docid
=
int
.Parse(cmbDoc.SelectedValue.ToString());
//
由编号从数据库中提取出该编号的文档类对象
Class.ClassDoc cd
=
new
DocAddin.Class.ClassDoc(docid);
tbPath.Text
=
cd.S路径;
if
(tbName.Text.Trim()
==
""
)
{
tbName.Text
=
cd.S名称
+
"
-
"
;
}
}
}