更改ListBox选项会更改其他ListBox的选择。这是怎么回事?

时间:2008-11-12 21:29:12

标签: c# .net winforms data-binding

我在同一表单上有一个带有两个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'。

任何人都可以告诉我为什么会发生这种情况。

干杯

7 个答案:

答案 0 :(得分:4)

列表不存储当前位置 - 它是CurrencyManager。与相同参考作为BindingContext的任何控件(具有相同DataSource)将共享CurrencyManager。通过使用不同的列表实例,您可以获得不同的CurrencyManager个实例,从而分离位置。

您只需使用.ToList()或创建具有相同内容的新List<T>(根据您的原始帖子),或通过将新BindingContext分配给一个来实现相同的效果控制:

control.BindingContext = new BindingContext();

答案 1 :(得分:2)

我相信你的两个控件正在共享一个CurrencyManager。我不确定为什么。
作为一种解决方法,您可以尝试使用简单的字符串填充列表框。或者您可能想尝试创建BindingSource组件的单独实例,并绑定到那些。

答案 2 :(得分:1)

当我在两个列表框上使用相同的数据源时,我也遇到了同样的问题,但创建两个相同的数据源解决了我的问题。我看到你的代码没有错。 Thing课程有什么特别之处吗?或者它只包含两个成员Le​​tters和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中,这可以按预期工作。

上帝只知道我做了什么让它做它正在做的事情