【问题标题】:Changing a ListBox selection changes other ListBox's selection. What's going on?更改 ListBox 选择会更改其他 ListBox 的选择。这是怎么回事?
【发布时间】:2008-11-12 21:29:12
【问题描述】:

我有一个 Windows 窗体应用程序,在同一个窗体上有两个 ListBox 控件。 它们都将其 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”。

谁能告诉我为什么会这样。

干杯

【问题讨论】:

    标签: c# .net winforms data-binding


    【解决方案1】:

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

    您可以通过使用.ToList() 或创建具有相同内容的新List&lt;T&gt;(根据您的原始帖子)或通过将新BindingContext 分配给其中一个控件来实现相同的目的:

    control.BindingContext = new BindingContext();
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 有什么技巧可以让他们使用不同的吗?
      • 其实我不知道他们是怎么分享的。我尝试了一个像 Shaun Bowe 这样的简单示例,列表框选择看起来是独立的。你能从干净的解决方案中重现问题吗?
      【解决方案3】:

      当我在两个列表框上使用相同的数据源时,我遇到了同样的情况,但是创建两个相等的数据源为我解决了这个问题。我看不出你的代码有什么问题。 Thing 类有什么特别之处吗?还是只包含两个成员 Letters 和 Id ?

      【讨论】:

      • 是的,只有两个成员。一个非常简单的类,纯粹是为了我的例子。
      【解决方案4】:

      还有更多...

      我终于明白了。

      我将两个 ListBox 绑定到同一个列表。通过将代码更改为

      theListBox.DataSource = _contacts.Take(_contacts.Count).ToList();
      

      问题已解决。

      似乎对它存储的 List 的引用还将任何绑定或选择信息转移到另一个 ListBox。

      小心。 ;)

      【讨论】:

        【解决方案5】:

        我创建了一个新的 win forms 应用程序,上面有两个列表框。他们的行为和我预期的一样。你能发布完整的代码吗?这是我的代码。

        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";
        }
        

        }

        【讨论】:

          【解决方案6】:

          我试图在我自己的机器上复制此行为,但无法仅运行您提供的代码。

          【讨论】:

            【解决方案7】:

            我的立场是正确的。

            在全新解决方案中的另一个 VS 实例中,这按预期工作。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-23
              • 1970-01-01
              • 2020-05-26
              • 1970-01-01
              相关资源
              最近更新 更多