2

我有两个数据绑定到同一个 BindingList 的 ListBox。

问题是当从 GUI 更改选定项时,它会更改 BindingList 中的位置,然后 BindingList 会向另一个 ListBox 发出信号以更改其选定项。

所以我有两个 ListBoxes Selected Item 也同步,这对我不利。

我想保持同步的项目列表。没有光标位置。

如何禁用该光标以使其不被维护?

示例代码(只需在设计时将两个 ListBoxes 添加到 Form 并注册 SelectedIndexChanged 事件并使用按钮注册按钮单击事件):

public partial class Form1 : Form
{
    BindingList<string> list = new BindingList<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        list.Add("bla1");
        list.Add("bla2");
        list.Add("bla3");

        this.listBox1.DataSource = list;
        this.listBox2.DataSource = list;
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex != -1)
            System.Diagnostics.Trace.WriteLine("ListBox1: " + listBox1.SelectedItem.ToString());
    }

    private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox2.SelectedIndex != -1)
            System.Diagnostics.Trace.WriteLine("ListBox2: " + listBox2.SelectedItem.ToString());
    }

    // Register this event to a button
    private void button1_Click(object sender, EventArgs e)
    {
        list.Add("Test");
    }
}

谢谢,--冉。

4

3 回答 3

7

将此行添加到Form_Load

this.listBox1.BindingContext = new BindingContext();
于 2008-11-10T13:28:06.767 回答
2

将 listBox1 和 listBox2 声明为以下类型似乎会导致所需的行为。

class MyListBox: ListBox {

    protected override void OnSelectedIndexChanged (EventArgs a) {
        if (DataManager != null) {
            DataManager.SuspendBinding();
        }
    }

}

问候,坦伯格

于 2008-11-06T22:40:47.947 回答
0

我对这个问题的解决方案是使用普通 List 而不是 BindingList 并在 Form 对象上调用(在更改之前): this.BindingContext[Your List].SuspendBinding(); 并在更改为 List this.BindingContext[Your List].ResumeBinding(); 这将更新所有有界控件。

请注意,此处的 MSDN 链接中也注明了这一点:

“如果你绑定了一个没有实现IBindingList接口的数据源,比如ArrayList,那么当数据源更新的时候,绑定的控件的数据就不会更新了。比如你有一个组合框绑定到了一个ArrayList并且数据被添加到 ArrayList 中,这些新项将不会出现在组合框中。但是,您可以通过在控件绑定到的 BindingContext 类的实例上调用 SuspendBinding 和 ResumeBinding 方法来强制更新组合框。”

于 2008-11-10T13:13:56.750 回答