天天看点

vs2005,combox 数据绑定和SelectedIndexChanged事件触发 引发的问题 - 马维拉的真实之眼

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名称 + "-";                    

                }

            }

        }