题
假设你正在做的事情如下
List<string> myitems = new List<string>
{
"Item 1",
"Item 2",
"Item 3"
};
ComboBox box = new ComboBox();
box.DataSource = myitems;
ComboBox box2 = new ComboBox();
box2.DataSource = myitems
所以现在我们有2组合框开这阵列,以及一切工作正常。但是当你改变价值的一种组合框,它改变了这两个组合框到一个你刚才选择的。
现在,我知道,这阵总是通过参考(了解到,当我得知C:D),但为什么在地球上的组合框改变在一起吗?我不认为组合框控制是修改收集的。
作为一种解决办法,不要这将实现的功能,这些功能预期的/需要的
ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
解决方案
这与数据如何绑定设立在dotnet框架,尤其是 BindingContext
.在一个高水平这意味着,如果你没有指定,否则各种形式和所有制的形式共享相同的 BindingContext
.当你设置的 DataSource
酒店的 ComboBox
将使用 BindingContext
得到一个 ConcurrenyMangager
包装的清单。的 ConcurrenyManager
跟踪这样的事情,因为当前的选择在列表中的位置。
当你设置的 DataSource
第二 ComboBox
它将使用相同的 BindingContext
(形式),它将产生一个参照相同的 ConcurrencyManager
作为上述用来设立数据绑定。
以获得更详细的解释见 BindingContext.
其他提示
一个更好的解决办法(根据大小的数据源)是宣布两个 BindingSource
对象(新的2.00)结合收集到的那些,然后结合这些的组合框.
我附上一个完整的示例。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private BindingSource source1 = new BindingSource();
private BindingSource source2 = new BindingSource();
public Form1()
{
InitializeComponent();
Load += new EventHandler(Form1Load);
}
void Form1Load(object sender, EventArgs e)
{
List<string> myitems = new List<string>
{
"Item 1",
"Item 2",
"Item 3"
};
ComboBox box = new ComboBox();
box.Bounds = new Rectangle(10, 10, 100, 50);
source1.DataSource = myitems;
box.DataSource = source1;
ComboBox box2 = new ComboBox();
box2.Bounds = new Rectangle(10, 80, 100, 50);
source2.DataSource = myitems;
box2.DataSource = source2;
Controls.Add(box);
Controls.Add(box2);
}
}
}
如果你想要混淆自己甚至更多的然后试试总是宣称的绑定在构造。这可能导致一些 真的 奇怪的错误,因此我总是绑定在装载活动。
不隶属于 StackOverflow