现在的位置: 首页 > 综合 > 正文

vs2005,combox 数据绑定和SelectedIndexChanged事件触发 引发的问题

2012年11月09日 ⁄ 综合 ⁄ 共 1520字 ⁄ 字号 评论关闭

昨天前天,都在折腾一个问题,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名称 + "-";                    
                }
            }
        }

抱歉!评论已关闭.