• ComboBox绑定数据源时触发SelectedIndexChanged事件的处理办法


    转载:http://blog.sina.com.cn/s/blog_629e606f01014d4b.html

    ComboBox最经常使用的事件就是SelectedIndexChanged。但在将ComboBox绑定到某个数据源的过程中,会触发SelectedIndexChanged
    事件,而这个时候用户并没有选择内容,其SelectedValue也不是对应字段的值。那么时写在SelectedIndexChanged中的处理代码就会因为SelectedValue的内容不正确引发异常。
    一般网上找到的方法是添加一个标记位,在绑定前设置为false,绑定完成后设置回true。

     
    void BindComboBox()
    {
        flag
    =false;
        ComboxBox1.ValueMember
    ="ValueColumn";
        ComboxBox1.DisplayMember
    ="DisplayColumn";
        ComboxBox1.DataSource
    =DataTable1;
        flag
    =true;
    }
     
     
    private void ComboxBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        
     if(flag)
         {
             
     //Do something
          }   
    }
    另外还有一种办法,就是在绑定前,将SelectedIndexChanged的委托去掉,等绑定完成后,再添加事件委托。
     
    void BindComboBox()
    {         
     //去除委托
                ComboBox1.SelectedIndexChanged -= new EventHandler(ComboBox1_SelectedIndexChanged);           
                ComboBox1.DataSource
     = null;
                ComboBox1.ValueMember
     = "ValueColumn";          
                ComboBox1.DataSource
     = DataTable1;
               
     //添加委托 
                ComboBox1.SelectedIndexChanged += new EventHandler(ComboBox1_SelectedIndexChanged);
                ComboBox1.DisplayMember
     = "DisplayColumn";
    }
    两种方法都可以,但是之间的优劣暂时没去比较。感觉好像处理一下委托会好点。因为这种办法真的减少了事件的激发次数。
    不知道还有没有其他解决方案呢?

    另,贴上一段完整的代码例子。这个例子是访问SqlServer数据库的AdventureWorks,通过ProductCategory和ProductSubCategory两级目录分类去查看Product表的内容。分别使用两个ComboBox和DataGridView完成数据绑定。效果就是选择之后会联动改变相关内容。

     
    public partial class frmProduct : Form
        {
    DataSet DS
     = new DataSet();
            String ConnectionString
     = "integrated security=true; database=AdventureWorks; server=localhost; ";
           
     public frmProduct()
            {
                InitializeComponent();
            }
           
           
     private void frmProduct_Load(object sender, EventArgs e)
            {
                SqlDataAdapter da
     = new SqlDataAdapter("select ProductCategoryID,[Name] from Production.ProductCategory", ConnectionString)
    ;
                cbbCategories.SelectedIndexChanged
     -= newEventHandler(cbbCategories_SelectedIndexChanged);
                da.Fill(DS,
     "ProductCategory");
                cbbCategories.DataSource
     = null;
                cbbCategories.ValueMember
     = "ProductCategoryID";          
                cbbCategories.DataSource
     = DS.Tables["ProductCategory"];
                cbbCategories.SelectedIndexChanged
     += newEventHandler(cbbCategories_SelectedIndexChanged);
                cbbCategories.DisplayMember
     = "Name";//这句放在事件委托之后才会有联动效果,下同
            }

           
     private void cbbCategories_SelectedIndexChanged(object sender, EventArgs e)
            {
                SqlDataAdapter da
     = new SqlDataAdapter("select ProductSubCategoryID,[Name] from Production.ProductSubCategory where  ProductCategoryID=" + cbbCategories.SelectedValue.ToString(), ConnectionString)
    ;
               
     if (DS.Tables["ProductSubCategory"] != null)
                {
                    DS.Tables[
    "ProductSubCategory"].Clear();
                }
                da.Fill(DS,
     "ProductSubCategory");
                cbbSubCategories.SelectedIndexChanged
     -= newEventHandler(cbbSubCategories_SelectedIndexChanged);
                cbbSubCategories.DataSource
     = null;           
                cbbSubCategories.ValueMember
     = "ProductSubCategoryID";
                cbbSubCategories.DataSource
     = DS.Tables["ProductSubCategory"];
                cbbSubCategories.SelectedIndexChanged
     += newEventHandler(cbbSubCategories_SelectedIndexChanged);
                cbbSubCategories.DisplayMember
     = "Name";
            }       

           
     private void cbbSubCategories_SelectedIndexChanged(object sender, EventArgs e)
            {
               
     if (cbbSubCategories.SelectedIndex == -1)
                   
     return;
                SqlDataAdapter da
    =new SqlDataAdapter("select * from Production.Product where ProductSubCategoryID=" + cbbSubCategories.SelectedValue.ToString(), ConnectionString);
                dgvProduct.DataSource
     = null;
               
     if (DS.Tables["Product"] != null)
                    DS.Tables[
    "Product"].Clear();
                da.Fill(DS,
     "Product");
                dgvProduct.DataSource
     = DS.Tables["Product"];
            }
        }
  • 相关阅读:
    C# 文件绝对路径与相对路径的转换
    DevExpress TreeList 禁止节点拖动到其他节点上
    C# 通过KD树进行距离最近点的查找.
    C# 利用键值对取代Switch...Case语句
    C# 利用位运算传递多个参数方法
    Deepin安装node与npm
    python-demo:计算合格率
    SpringDataJpa在一对多、多对多关系映射时出现StackOverflowError
    npm install 问题汇总
    CentOS7 使用firewalld打开关闭防火墙与端口
  • 原文地址:https://www.cnblogs.com/xuxin-1989/p/3719103.html
Copyright © 2020-2023  润新知