2

リストへの DataGridView バインディングと、レコード数を示すラベルがあります。Khashが抱えていたのと同じ問題に遭遇しました。(だから私は彼の称号を盗む)。グリッドで追加または削除操作を行っても、ラベルは更新されません。

ここに画像の説明を入力

Sung の回答であるファサード ラッパーに基づいて、継承BindingListおよび実装するカスタム リストを作成しますINotifyPropertyChanged

public class CountList<T> : BindingList<T>, INotifyPropertyChanged
{    
    protected override void InsertItem(int index, T item)
    {
        base.InsertItem(index, item);
        OnPropertyChanged("Count");
    }

    protected override void RemoveItem(int index)
    {
        base.RemoveItem(index);
        OnPropertyChanged("Count");
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

ただし、これはバインド時に例外をスローします。

Cannot bind to the property or column Count on the DataSource. Parameter name: dataMember

以下は私のバインディングコードです:

private CountList<Person> _list;

private void Form1_Load(object sender, EventArgs e)
{
    _list = new CountList<Person>();
    var binding = new Binding("Text", _list, "Count");
    binding.Format += (sender2, e2) => e2.Value = string.Format("{0} items", e2.Value);
    label1.DataBindings.Add(binding);
    dataGridView1.DataSource = _list;
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

任意の提案をいただければ幸いです。ありがとうございました。

4

1 に答える 1

5

実際、それはあなたが思っているよりずっと簡単です!

Microsoft は既に BindingSource コントロールを作成しているため、それを使用し、BindingSource イベントを処理してラベルを更新する必要があります。

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    private BindingSource source = new BindingSource();

    private void Form1_Load(object sender, EventArgs e)
    {
        var items = new List<Person>();
        items.Add(new Person() { Id = 1, Name = "Gabriel" });
        items.Add(new Person() { Id = 2, Name = "John" });
        items.Add(new Person() { Id = 3, Name = "Mike" });
        source.DataSource = items;
        gridControl.DataSource = source;
        source.ListChanged += source_ListChanged;

    }

    void source_ListChanged(object sender, ListChangedEventArgs e)
    {
        label1.Text = String.Format("{0} items", source.List.Count);
    }
于 2013-05-21T04:59:40.567 に答える