Aquí podría ser tu PUBLICIDAD


¿Cómo vincular un recuento de listas a una etiqueta en WinForms?

votos
4

¿Cómo puedo vincular el conteo de una lista a una etiqueta? El siguiente código no se actualiza con la lista cambiada:

private IList<string> list = new List<string>();
//...
label1.DataBindings.Add(Text, list.Count, );
Publicado el 12/03/2009 a las 19:27
fuente por usuario Khash
En otros idiomas...        العربية       

3 respuestas

votos
1

Según Marc Gravell para este problema, ha sugerido crear una fachada que envuelva la colección que desea vincular a label1.Text

Intenté implementar uno (por diversión) y pude vincular el funcionamiento de Count .
CountList<T>es una fachada que envuelve una colección para enlazar.

Aquí está el lleno de la demostración.

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"));
        }
    }
}
Respondida el 13/03/2009 a las 03:24
fuente por usuario Sung


Aquí podría ser tu PUBLICIDAD


votos
1

Las vinculaciones escuchan el evento PropertyChanged de la interfaz IPropertyChanged. No creo que List.Count se informe como un evento PropertyChanged cuando se modifique.

Lo que podría hacer es implementar su lista personalizada o buscar una colección que notifique cuándo se cambia el recuento.

Respondida el 12/03/2009 a las 07:49
fuente por usuario Sergiu Damian

votos
0

Puede usar DataSourceChanged si tiene un origen de datos para el listbox. Solo recuerda actualizar y volver a vincular el origen de datos.

Esto puede ser un poco gueto, pero aquí está el ejemplo con el que trabajé:

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();
    }
Respondida el 12/03/2009 a las 08:27
fuente por usuario user58044