Ligação de dados de DataGridView e List <> com BindingSource
-
12-09-2019 - |
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();
}
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.