Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

ucel.net

DataBinding, który nie działa tak jak trzeba

Natknąłem się dzisiaj na dziwny problem w mechanizmie DataBinding. Problem ten dał się zredukować do prostego przykładu, który przedstawię poniżej.

Na początek definiuję sobie strukturę danych złożoną z dwóch tabel, jednej nadrzędnej i jednej podrzędnej:


Te tabele w jakiś sposób wypełniam sobie danymi:


Po czym tworzę aplikację do prezentacji i zmiany tych danych:


Tutaj kilka słów o ustawieniach łącz dla kontrolek. I tak bindingSource1 jest podłączona do data1.Parent, parentChildBindingSource zostało utworzone automatycznie i reprezentuje relację z Rys. 1. ListBox po lewej pobiera dane z bindingSource1 i wyświetla wartość właściwości Name, TextBox analogicznie wartość właściwości Description. Kod aplikacji jest dołączony do postu do ściągnięcia i przetestowania. Wszystko działa (teoretycznie) tak jak powinno:


Zgodnie z dokumentacją, jeśli spróbujemy zmienić jedną z wartości na tym formularzu, to odpowiedni wiersz zmieni swój status z Unchanged na Modified. Informacja o stanie może zostać później użyta na przykład przy zapisywaniu zawartości datasetu z powrotem do bazy. Stąd olbrzymie moje zaskoczenie, kiedy to okazało się, że nie ma problemu w zmianie wartości pól tabeli podrzędnej (w gridzie), ale zmiana wartości Description tabeli nadrzędnej w TextBoxie powoduje zmianę odpowiedniej wartości w wierszu, ale nie(!) powoduje zmiany stanu wiersza.


Jak widać, wiersze z DataGridView zmieniły swój stan na Modified, nawet bez zmiany aktualnego wiersza (drugi wiersz), ale choć Description w aktywnym wierszu tabeli głównej został zmieniony, to zmiana ta nie została uwzględniona w opisie stanu wiersza, co oznacza, że zmiany te nie zostaną później zapisane do bazy. Pomaga zmiana wiersza tabeli głównej i powrót do edytowane wiersza, ale co robić, gdy mamy tylko jeden wiersz w tabeli głównej?

W powyższym przykładzie pomogła implementacja procedury obsługi zdarzenia TextChanged:


Bezpośrednie przypisanie wartości do właściwości Description powoduje zmianę stanu wiersza na Modified. Ale czy takie rzeczy nie powinny się dziać automatycznie?

Opublikowane 28 października 2007 17:41 przez ucel
Filed under: ,

Attachment(s): DataBindingTest.zip

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

 

woro said:

Z mojego doświadczenia wynika, że problem leży po stronie kontrolki DataGridView.

Ogólnie edycja danych poprzez tą kontrolkę jest dość problematyczna i prowadzi do wielu zaskakujących odkryć. Osobiście odradzam edycje danych przez kontrolkę DataGridView jeśli już konieczna jest edycja na Gridzie to polecam jedną z komercyjnych kontrolek. :)

października 31, 2007 13:53

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)
Wyślij
W oparciu o Community Server (Personal Edition), Telligent Systems