3

私はVB.NETで作業しています

クラス Invoice のオブジェクトが入力された Invoices という名前の ArrayList があります。

これを ListBox にデータ バインドして、ArrayList の内容が更新され、ListBox の更新が変更されるようにしたいと思います。Invoice クラスに .ToString 関数を実装しましたが、ArrayList を ListBox にバインドする方法がわかりません。

助言がありますか?

4

1 に答える 1

2

これはwinformsであると仮定します。

双方向のデータ バインディングが必要な場合は、次のものが必要です。

  • 追加/削除などを検出するには、実装するデータソースが必要IBindingListです; クラスの場合BindingList<T>、当然の選択です(ArrayList単にそうしません...)
  • オブジェクトのプロパティへの変更を検出するには、実装する必要がありますINotifyPropertyChanged(通常は「*Changed」パターンを使用できますが、これは によって尊重されませんBindingList<T>) 。

幸いなことに、ListBoxこれらの両方を処理します。完全な例は次のとおりです。私はC#を使用しましたが、概念は同じです...

using System;
using System.ComponentModel;
using System.Windows.Forms;
class Data : INotifyPropertyChanged{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; OnPropertyChanged("Name"); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this,
            new PropertyChangedEventArgs(propertyName));
    }
}
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Button btn1, btn2;
        BindingList<Data> list = new BindingList<Data> {
            new Data { Name = "Fred"},
            new Data { Name = "Barney"},
        };
        using (Form frm = new Form
        {
            Controls =
            {
                new ListBox { DataSource = list, DisplayMember = "Name",
                     Dock = DockStyle.Fill},
                (btn1 = new Button { Text = "add", Dock = DockStyle.Bottom}),
                (btn2 = new Button { Text = "edit", Dock = DockStyle.Bottom}),
            }
        })
        {
            btn1.Click += delegate { list.Add(new Data { Name = "Betty" }); };
            btn2.Click += delegate { list[0].Name = "Wilma"; };
            Application.Run(frm);
        }
    }
}
于 2009-08-17T20:50:09.627 に答える