Eu tenho uma aula
class Person{
public string Name {get; set;}
public string Surname {get; set;}
}
e um List<Person>
ao qual adiciono alguns itens. A lista está vinculada ao meu DataGridView
.
List<Person> persons = new List<Person>();
persons.Add(new Person(){Name="Joe", Surname="Black"});
persons.Add(new Person(){Name="Misha", Surname="Kozlov"});
myGrid.DataSource = persons;
Não tem problema. myGrid
exibe duas linhas, mas quando adiciono novos itens à minha persons
lista, myGrid
não mostra a nova lista atualizada. Mostra apenas as duas linhas que adicionei antes.
Então qual é o problema?
Ligar sempre funciona bem. Mas quando eu vinculo um DataTable
à grade, toda vez que faço algumas alterações DataTable
, não há necessidade de religar myGrid
.
Como resolver isso sem religar todas as vezes?
One
É uma maneira de usar um BindingList, que levantará um evento se a lista subjacente mudar. Outra maneira é usar umBindingSource
e chamar ResetBinding () toda vez que você adicionar / deletar uma linha, mas isso dá mais trabalho. Caso queira informar a Rede sobre as mudanças nas propriedades a maneira mais fácil é implementarINotifyPropertyChanged
List<T>
se desejar. Mas se você adicionar itens de forma programática ao List DataGridView não saberá disso porque List não implicaIBindingList
. Em relação a BindingSource: Eu uso muito winforms e não me vinculo a nada além de BindingSource - FULLSTOP. Adicionar mais detalhes é demais para um comentário, masBindingSource
tem muito a oferecer sem quaisquer desvantagens. Eu iria tão longe e diriaAnyone who does not use a BindingSource for binding has not fully understood windows forms databindings
BindingSource
como uma ponte entre sua fonte de dados e sua GUI. Ele resolve muitos problemas relacionados à ligação de dados. Você quer recarregar seus dados? Basta definirbindingSource.DataSource
sua nova coleção em vez de religar todos os controles. Seu DataSource pode ser nulo? ConjuntobindingSource.DataSource = typeof(YourClass)
Você deseja ter uma grade editável, mas sua fonte de dados não tem um construtor sem parâmetros? Basta implementar obindingSource.AddingNew
evento e criar o objeto você mesmo. Nunca experimentei uma desvantagem durante o uso,BindingSource
mas muitos benefícios.Cada vez que você adiciona um novo elemento à lista, você precisa religar sua grade. Algo como:
fonte
Sim, é possível fazer com nossa religação implementando a interface INotifyPropertyChanged.
Um exemplo muito simples está disponível aqui,
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
fonte
INotifyPropertyChanged
o DataGridView irá mostrar todas as alterações de propriedade que acontecem em segundo plano, mas não saberá se você adicionar / excluir uma linha de sua fonte. Para isso existe umaIBindingList
interface e, para sua comodidade, uma implementaçãoBindingList<T>
que já a implementa, mas não suporta ordenação / filtragem.Depois de adicionar um novo item para
persons
adicionar:fonte
null
se você atribuí-lo imediatamentepersons
na próxima linha?Este não é exatamente o problema que eu tive, mas se alguém está procurando converter um BindingList de qualquer tipo em List do mesmo tipo, então é feito assim:
Além disso, se você estiver atribuindo BindingLists de tipos dinâmicos a um DataGridView.DataSource, certifique-se de declará-lo primeiro como IBindingList para que o acima funcione.
fonte