リストのカウントをラベルにバインドする方法を教えてください。次のコードは、リストで更新されますdoes'tが変更されます。リスト数をWinFormsのラベルにバインドする方法は?
private IList<string> list = new List<string>();
//...
label1.DataBindings.Add("Text", list.Count, "");
リストのカウントをラベルにバインドする方法を教えてください。次のコードは、リストで更新されますdoes'tが変更されます。リスト数をWinFormsのラベルにバインドする方法は?
private IList<string> list = new List<string>();
//...
label1.DataBindings.Add("Text", list.Count, "");
が、彼はあなたがます。Label1.Text
にバインドするコレクションをラップ suggested to create a facadeを持っています私は1つを(楽しいために)実装しようとしましたが、番号にバインドすることができました。
は、バインドするコレクションをラップするファサードです。CountList<T>
ここにはデモが満載です。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
namespace TextBindingTest
{
public partial class Form1 : Form
{
private readonly CountList<string> _List =
new CountList<string>(new List<string> { "a", "b", "c" });
public Form1()
{
InitializeComponent();
BindAll();
}
private void BindAll()
{
var binding = new Binding("Text", _List, "Count", true);
binding.Format += (sender, e) => e.Value = string.Format("{0} items", e.Value);
label1.DataBindings.Add(binding);
}
private void addToList_Click(object sender, EventArgs e)
{
_List.Add("a");
}
private void closeButton_Click(object sender, EventArgs e)
{
Close();
}
}
public class CountList<T> : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private void OnPropertyChanged(PropertyChangedEventArgs e)
{
var handler = PropertyChanged;
handler(this, e);
}
private ICollection<T> List { get; set; }
public int Count { get { return List.Count; } }
public CountList(ICollection<T> list)
{
List = list;
}
public void Add(T item)
{
List.Add(item);
OnPropertyChanged(new PropertyChangedEventArgs("Count"));
}
}
}
バインディングはIPropertyChangedインターフェイスのPropertyChangedイベントに耳を傾けます。私は、List.Countが変更されたときPropertyChangedイベントとして報告されるとは思わない。
カスタムリストを実装するか、カウントが変更されたときに通知するコレクションを見つけることができます。
BindingListクラスは、変更されたときにイベントを発生させるので、より効果的です。 – Andy
リストボックス用のデータソースがある場合は、DataSourceChangedを使用できます。データソースの更新と再バインドを忘れないでください。
これは、ビットゲットーかもしれませんが、ここで私が一緒に働いた例です。この問題のためのMarc Gravellによると
List<int> collection = new List<int>();
public Form1()
{
InitializeComponent();
listBox1.DataSourceChanged += listbox1_Changed;
}
private void button1_Click(object sender, EventArgs e)
{
collection.Add(new Random().Next(100));
listBox1.BeginUpdate();
listBox1.DataSource = null;
listBox1.DataSource = collection;
listBox1.EndUpdate();
}
private void listbox1_Changed(object sender, EventArgs e)
{
textBox1.Text = collection.Count.ToString();
}
これは仕事だと思いますが、少年は複雑です!このような簡単なバインディングを行う簡単な方法があるはずだと思います。 Winformsのすべてのデータバインディング機能は、リストとグリッドに対応することです。 – Khash
はい、必要以上に複雑に見えます。私は最近、WPFを調べ始めました。この種のバインディングの問題は、XAMLで解決されているようです。 – Sung
正しいことについての音;-p –