zoukankan      html  css  js  c++  java
  • winfrom 窗体控件实现二级联动

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

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

    绑定到ComboBox
    
    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的委托去掉,等绑定完成后,再添加事件委托。

    两种方法都可以,但是之间的优劣暂时没去比较。感觉好像处理一下委托会好点。因为这种办法真的减少了事件的激发次数。
    不知道还有没有其他解决方案呢?

    另,贴上一段完整的代码例子。这个例子是访问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 -= new EventHandler(cbbCategories_SelectedIndexChanged);
                da.Fill(DS, "ProductCategory");
                cbbCategories.DataSource = null;
                cbbCategories.ValueMember = "ProductCategoryID";           
                cbbCategories.DataSource = DS.Tables["ProductCategory"]; 
                cbbCategories.SelectedIndexChanged += new EventHandler(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 -= new EventHandler(cbbSubCategories_SelectedIndexChanged);
                cbbSubCategories.DataSource = null;            
                cbbSubCategories.ValueMember = "ProductSubCategoryID";
                cbbSubCategories.DataSource = DS.Tables["ProductSubCategory"];
                cbbSubCategories.SelectedIndexChanged += new EventHandler(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"];
            }
        }

    参考:https://www.cnblogs.com/Bonizlee/archive/2011/05/24/2054942.html?tdsourcetag=s_pctim_aiomsg感谢楼主提供的方法

    成为不了聪明的人,那就做一个有耐心、肯钻研,坚持不懈,永不放弃的人……
  • 相关阅读:
    DS博客作业05--树
    DS博客作业03--栈和队列
    DS博客作业02--线性表
    DS博客作业01-日期抽象数据类型设计和实现
    easyx的基础应用教程
    C语言博客作业06--结构体&文件
    python接口自动化
    fiddler的使用
    python接口自动化——初级
    python.day.10——面向对象(二)
  • 原文地址:https://www.cnblogs.com/wrld/p/10159911.html
Copyright © 2011-2022 走看看