WinForms - VB.NET - 为两个不同的列表框传递与数据源相同的列表会产生问题

Posted

技术标签:

【中文标题】WinForms - VB.NET - 为两个不同的列表框传递与数据源相同的列表会产生问题【英文标题】:WinForms - VB.NET - Passing same list as DataSource for two different listboxes create problems 【发布时间】:2010-12-31 00:44:27 【问题描述】:

查看下面的简单代码:

Public Class Form1
    Private _items As List(Of String) = New List(Of String)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _items.Add("Item1")
        _items.Add("Item2")
        _items.Add("Item3")

        ListBox1.DataSource = _items
        ListBox2.DataSource = _items
    End Sub
End Class

发生的情况是,当在第一个列表框中选择 Item2 时,第二个列表框会自动将其所选项目更改为 Item2。这与其他列表框发生的情况相同。

知道为什么会这样吗?

【问题讨论】:

【参考方案1】:

是的,这会发生。将 DataSource 绑定到控件时,控件会将自身绑定到 DataSource 的事件并在内部调用其方法。数据源会触发 SelectionChanged、CurrentRecordChanged(不确定确切名称)等事件。

例如当您在 ListBox1 中选择一个项目时,列表框会更改 DataSource 中的当前记录指针,该指针又会在 CurrentRecordChanged 等事件中生成。此事件由 listbox2(也由 listbox1)捕获并更改其当前记录。

【讨论】:

【参考方案2】:

试试这个

using System.Linq;

    ListBox1.DataSource = _items.ToArray();
    ListBox2.DataSource = _items.ToArray();

【讨论】:

【参考方案3】:

这是因为您的两个 ListBox 共享表单的默认 BindingContext 对象。要更改这一点,请为每个 ListBox 显式创建一个 BindingContext。

【讨论】:

以上是关于WinForms - VB.NET - 为两个不同的列表框传递与数据源相同的列表会产生问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VB.Net winforms 应用程序中找到 main() 入口点?

VB.NET(WinForms)中带参数的安全线程池队列

所有循环崩溃winforms vb.net?

如何通过 vb.net 让其他应用程序(计算器)在 winforms 中脱颖而出?

vb.net 创建数据表?

在 Visual Studio 2010 的 vb.net 中创建钻取 rdlc 报告