winfrom 窗体控件实现二级联动
Posted wrld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winfrom 窗体控件实现二级联动相关的知识,希望对你有一定的参考价值。
事件,而这个时候用户并没有选择内容,其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感谢楼主提供的方法
以上是关于winfrom 窗体控件实现二级联动的主要内容,如果未能解决你的问题,请参考以下文章