How to link list count to label in WinForms?

How to associate a list counter with a label. The following code has been changed: "

private IList<string> list = new List<string>(); //... label1.DataBindings.Add("Text", list.Count, ""); 
+4
source share
3 answers

According to Mark Gravel on this issue, he suggested creating a facade that wraps the collection that you want to bind to label1.Text

I tried to implement one (for fun) and was able to get a reference to the work of Count.
CountList<T> is the facade that wraps the collection for binding.

Here is a complete demo.

 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")); } } } 
+1
source

Bindings listen on the PropertyChanged event of the IPropertyChanged interface. I do not think List.Count is being reported as a PropertyChanged event when it changes.

What you can do is implement your own list or find a collection that notifies you when the bill will be changed.

+1
source

You can use DataSourceChanged if you have a data source for the list. Just remember to update and restore the data source.

It might be a bit of a ghetto, but here is an example I worked with:

 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(); } 
0
source

All Articles