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?