2

同じ BindingList にデータバインドされた 2 つの ListBox があります。

問題は、選択した項目を GUI から変更すると、BindingList 内の位置が変更され、BindingList が他の ListBox に選択した項目を変更するように通知することです。

そのため、2 つの ListBoxes Selected Item も同期されていますが、これは私にとっては良くありません。

アイテムのリストを同期して維持したいと思います。カーソル位置なし。

維持されないようにそのカーソルを無効にするにはどうすればよいですか?

サンプル コード (デザイン時にフォームに 2 つの ListBox を追加し、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

この問題に対する私の解決策は、BindingList の代わりに通常の List を使用し、Form オブジェクトを (変更前に) 呼び出すだけです。List this.BindingContext[Your List].ResumeBinding(); への変更後 これにより、すべての境界コントロールが更新されます。

こちらのMSDNリンクにも記載されていることに注意してください。

「ArrayList など、IBindingList インターフェイスを実装しないデータ ソースにバインドされている場合、バインドされたコントロールのデータは、データ ソースが更新されても更新されません。たとえば、コンボ ボックスが ArrayList にバインドされている場合、データが ArrayList に追加された場合、これらの新しい項目はコンボ ボックスに表示されませんが、コントロールがバインドされている BindingContext クラスのインスタンスで SuspendBinding および ResumeBinding メソッドを呼び出すことにより、コンボ ボックスを強制的に更新できます。 ."

于 2008-11-10T13:13:56.750 に答える