Pergunta

Eu estou tentando descobrir como a vinculação de dados com BindingSource é suposto trabalho Eu quero um DataGridView a ser preenchido com o conteúdo de um List<> na atualização da lista.

Eu posso ver a crescer List e verificar se ele está sendo preenchido quando eu verificar o depurador. Eu pensei que o BindingSource iria disparar um evento quando o List é alterado. Mas nenhum dos disponíveis é acionado. Como posso ser notificado quando a lista subjacente é alterado?

I seguir as instruções e ter o seguinte código de teste:

    Data d;
    BindingSource bs;

    public Form1()
    {
        InitializeComponent();
        bs = new BindingSource();
        d = new Data();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        bs.DataSourceChanged += new EventHandler(bs_DataSourceChanged);
        bs.ListChanged += new ListChangedEventHandler(bs_ListChanged);
        bs.DataMemberChanged += new EventHandler(bs_DataMemberChanged);
        bs.CurrentChanged += new EventHandler(bs_CurrentChanged);
        bs.CurrentItemChanged += new EventHandler(bs_CurrentItemChanged);

        bs.DataSource = d.list;
        dataGridView1.DataSource = bs;
    }
    // ... all the handling methods caught with a break point in VS.

    private void button1_Click(object sender, EventArgs e)
    {
        d.addOneItem();
    }
Foi útil?

Solução

List<T> não suporta eventos de alteração; BindingList<T> seria um bom substituto para suportar este cenário, e também suporta eventos de mudança de nível de item se seu tipo T implementos INotifyPropertyChanged.

3,0 e acima, há também ObservableCollection<T> , que age de forma semelhante a BindingList<T>. Tudo se resume a interfaces como IBindingList, IBindingListView, etc.


A partir comentários; para um exemplo 2.0 / 3.0 de adição de um para Find BindingList<T>:

public class MyBindingList<T> : BindingList<T>
{
    public T Find(Predicate<T> predicate)
    {
        if (predicate == null) throw new ArgumentNullException("predicate");
        foreach (T item in this)
        {
            if (predicate(item)) return item;
        }
        return default(T);
    }
}

Note que em 3.5 (ou no .NET 2.0 / 3.0 com LINQBridge e C # 3.0) você não precisa disso -. Qualquer um dos métodos de extensão LINQ faria a mesma coisa

Outras dicas

Se você quiser ser notificado quando uma propriedade get mudou você precisa implementar INotifyPropertyChanged

aqui para um exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top