2011-06-29 11 views
6

Używam bindingsource w mojej aplikacji formularzy systemu Windows do zapełniania niektórych pól tekstowych itp. W moim widoku. Wiązanie działa dobrze, ale jak mogę zrezygnować z mojego obiektu bindingSource z mojego obiektu?rozłączanie bindingource

bindingSource.DataSource = new Foo();//OK 
bindingSource.DataSource = null;//Not ok 

Gdy próbuję rozwiązać poprzez ustawienie data = null uzyskać wyjątek:

System.ArgumentException: Nie można powiązać mienia lub kolumny barze na DataSource. Nazwa parametru: DataMember

Nie chcę, aby usunąć wszystkie powiązania moim kontroli (i dużo), ale chciałby zawiesić wiążące, o ile nie ma danych BindingSource ....

Znalazłem obejście takie jak ten bindingSource.DataSource = typeof(Foo);, ale czy to jest sposób?

+0

Jakiego rodzaju jest 'Foo'? – Tim

+5

po prostu Foo oczywiście – Gluip

Odpowiedz

0

nie jestem świadomy .Data właściwości dla obiektu BindingSource, ale jest własnością .DataSource, która może być ustawiona na null:

bindingSource.DataSource = null; 

To uwalnia źródło wiązania z danymi. Jednak patrząc na reference for BindingSource.DataSource:

DataSource property    List results 
---------------------------- ------------------------------------------- 
null with DataMember set  Not supported, raises ArgumentException. 

Jeśli używasz DataMember, nie można ustawić DataSource NULL bez wyjątku.

Niestety nie wiem, czy sposób obejścia tego problemu jest właściwy, ale przynajmniej teraz wiemy, że nie można po prostu powiązać z wartością NULL, gdy ustawiono DataMember.

+0

dzięki, patrząc na to. Będę trzymać się obejścia – Gluip

5

"Sposób obejścia" jest tym, co projektant formularzy okiennych robi po ustawieniu źródła danych BindingSource w strukturze PropertyGrid i wybierz typ z "Źródła danych projektu".

Sprawdź wygenerowany kod w pliku * .designer.cs dla swojego formularza.

Używamy tej "sztuczki" w jednym z naszych produktów i działa ona dobrze od wielu lat.

Pozdrowienia

0

mrlucmorin dał ci poprawną odpowiedź. Działa i jest właściwym sposobem radzenia sobie z taką sytuacją.

Nie działa to jednak, jeśli źródło danych ma typ DataTable. W takim przypadku możesz chcieć zagrać z bs.RaiseListChangedEvents = false; przed usunięciem źródła BindingSource.DataSource i ustawić go na true po przypisaniu nowego DataSource. Zaraz po ustawieniu go na wartość true, nie zapomnij zresetować powiązań za pomocą bs.ResetBindings(true);

Należy pamiętać, że może to spowodować pozostawienie w nich kontrolek databound zawierających "stare" dane.