你的位置:首页 > ASP.net教程

[ASP.net教程]Winform中多个ComboBox联动问题


本人在窗体中添加了一个FlowLayoutPanel控件flpControlContain,为了能让控件自动排位(省了自己控制位置)代码如下:
//在窗体中添加一个按钮,每当该按钮点击一次,添加一个下拉框 
private void btnAddNew_Click(object sender, EventArgs e)
{
this.ConditonCount++;//是一个私有字段,用于记录当前添加的是第几个,每添加一个自增1
//添加列名下拉列表
ComboBox cmb = new ComboBox();
cmb.Name = "列"+ConditonCount;//设置控件名称,用于在夫容器查询到该控
cmb.Width = SELECTWIDTH;//设置宽度,该值是一个常量
cmb.DataSource = this._columnslist;//绑定了一个字符串集合作为数据源
cmb.Tag = ConditonCount;//设置标识,为第几个
cmb.DropDownStyle = ComboBoxStyle.DropDownList;//设置下拉框下拉方式为只能选不能输入
cmb.SelectedIndexChanged += Cmb_SelectedIndexChanged;//绑定列名下拉框选项修改事件,目前只在该事件中输出控件的Tag
this.flpControlContain.Controls.Add(cmb);//添加到FlowLayoutPanel
}
当多个ComboBox添加到FlowLayoutPanel后,我这里绑定的下拉框数据源都是一样的,就会出现当一个下拉框选中某一项之后,所有的下拉框都会去选中同一选项!但是下拉框选中项改变事件只触发一次!!!!!!

 

于是弱弱的去贴吧问大神了~~得到的回答是:

-------------------------------------------------------------

cmb.DataSource = this._columnslist;
尝试修改为
cmb.DataSource = this._columnslist.ToList() ;

----------------------------------------------------------

最后试了下,成功了!问题就来了,是不是和绑定的是同一个数据源就关系,于是自己新建了一个窗体,手动添加两个ComboBox,但是给他们绑定的都是同一个List集合

实验发现还是会联动(选中ComboBox1中的一项,ComboBox2中也会选中同一项)!!!!!!

但是问题又来了:为什么绑定同一个数据源,会影响到控件的行为?可惜:贴吧大神没有告诉我!!!

于是结论:多个控件绑定同一个数据源会影响到控件的行为(至少ComboBox会),于是建议数据源是List时使用List.ToList()方法,返回一个新的List,如果是DataTable就使用DataTable.copy()复制一个给它,以避免因为绑定的是同一个数据,而使某一个控件的行为会影响到绑定了同数据源的其他控件