vs2005,combox 数据绑定和SelectedIndexChanged事件触发 引发的问题
昨天前天,都在折腾一个问题,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名称 + "-";
}
}
}