我在同一表单上有一个带有两个ListBox控件的Windows窗体应用程序。 他们都将SelectionMode设置为'MultiExtended'。
当我更改其中一个的选择时,选择其他更改。
现在我以为我用SelectedIndexChanged处理程序做了一些蠢事,所以我删除了它们并从头开始重新编写它们并解决了问题。
所以我创建了一个全新的WinForms应用程序并将两个ListBox拖到表单表面上。
在构造函数中,我使用以下内容填充它们。
List<Thing> data = new List<Thing>();
for ( int i = 0; i < 50; i++ ) {
Thing temp = new Thing();
temp.Letters = "abc " + i.ToString();
temp.Id = i;
data.Add(temp);
}
listBox1.DataSource = data;
listBox1.DisplayMember = "Letters";
listBox1.ValueMember = "Id";
List<Thing> data2 = new List<Thing>();
for ( int i = 0; i < 50; i++ ) {
Thing temp = new Thing();
temp.Letters = "abc " + i.ToString();
temp.Id = i;
data2.Add(temp);
}
listBox2.DataSource = data2;
listBox2.DisplayMember = "Letters";
listBox2.ValueMember = "Id";
然后我构建并运行了应用程序。
开始选择一些值以查看症状是否存在。 他们是!
这实际上是我添加到表单中的所有代码,我没有添加任何事件处理程序,我已经尝试将SelectionMode设置为'One'和'MultiExtended'。
任何人都可以告诉我为什么会发生这种情况。
干杯
答案 0 :(得分:4)
列表不存储当前位置 - 它是CurrencyManager
。与相同参考作为BindingContext
的任何控件(具有相同DataSource
)将共享CurrencyManager
。通过使用不同的列表实例,您可以获得不同的CurrencyManager
个实例,从而分离位置。
您只需使用.ToList()
或创建具有相同内容的新List<T>
(根据您的原始帖子),或通过将新BindingContext
分配给一个来实现相同的效果控制:
control.BindingContext = new BindingContext();
答案 1 :(得分:2)
我相信你的两个控件正在共享一个CurrencyManager。我不确定为什么。
作为一种解决方法,您可以尝试使用简单的字符串填充列表框。或者您可能想尝试创建BindingSource组件的单独实例,并绑定到那些。
答案 2 :(得分:1)
当我在两个列表框上使用相同的数据源时,我也遇到了同样的问题,但创建两个相同的数据源解决了我的问题。我看到你的代码没有错。 Thing课程有什么特别之处吗?或者它只包含两个成员Letters和Id?
答案 3 :(得分:1)
还有更多......
我终于得到了它的底部。
我将两个ListBox绑定到同一个List。通过将代码更改为
theListBox.DataSource = _contacts.Take(_contacts.Count).ToList();
这个问题已经完成了。
似乎对它所存储的List的引用也会将任何绑定或选择信息提供给其他ListBox。
小心点。 ;)答案 4 :(得分:0)
我创建了一个新的win表单应用程序,上面有两个列表框。他们表现得像我期望的那样。你能发布完整的代码吗?这是我的代码。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private class Thing
{
public String Letters { get; set; }
public Int32 Id { get; set; }
}
private void Form1_Load(object sender, EventArgs e)
{
List<Thing> data = new List<Thing>();
for (int i = 0; i < 50; i++)
{
Thing temp = new Thing();
temp.Letters = "abc " + i.ToString();
temp.Id = i;
data.Add(temp);
}
listBox1.DataSource = data;
listBox1.DisplayMember = "Letters";
listBox1.ValueMember = "Id";
List<Thing> data2 = new List<Thing>();
for (int i = 0; i < 50; i++)
{
Thing temp = new Thing();
temp.Letters = "abc " + i.ToString();
temp.Id = i;
data2.Add(temp);
}
listBox2.DataSource = data2;
listBox2.DisplayMember = "Letters";
listBox2.ValueMember = "Id";
}
}
答案 5 :(得分:0)
我尝试在自己的计算机上复制此行为,但无法运行您提供的代码。
答案 6 :(得分:0)
我有所纠正。
在另一个全新解决方案的VS中,这可以按预期工作。
上帝只知道我做了什么让它做它正在做的事情