DataBindings i WriteValue()

0

Witam,

Mam problem z aktualizacją wielu powiązań z ustawioną flagą
DataSourceUpdateMode.Never. Aktualizacja źródła danych następuje w chwili,
gdy użytkownik kliknie przycisk "Zapisz". Akcja ta powoduje wywołanie metody
WriteValue() dla każdego wiązania, ale niestety tylko dla pierwszego
wiązania dane są aktualizowane, natomiast pozostałe przyjmują wartości
sprzed modyfikacji. Kiedyś już spotkałem się z tym problemem, ale nie
pamiętam rozwiązania :-/.
Zatem jak uporać się z tym? Co jest przyczyną takiego zachowania?
Przykładowa sytuacja poniżej:

private void buttonSave_Click(object sender, EventArgs e)
        {
            textBoxPaletteName.DataBindings["Text"].WriteValue();
            textBoxPaletteDescription.DataBindings["Text"].WriteValue();

            paletteColorInfoBindingSource.EndEdit();
            paletteColorInfoBindingSource.ResetCurrentItem();
        }

Po wywołaniu 'textBoxPaletteName.DataBindings["Text"].WriteValue();', która
poprawnie aktualizuje źródło danych, wartość w kontrolce
textBoxPaletteDescription ustawiana jest na poprzednią wartość (sprzed
modyfikacji).

0

to mogloby znaczyc, ze gdzies wewnatrz WriteValue polecial jakis wyjatek, np. index out of range albo cast exception. to najpopularniejszy przypadek zmuszajacy databinding do wycofania zmian i przeladowania wartosci na swiezo z datasource'a. sprawdzisz to uzywajac debugerra i kazac mu explicite zatrzymac program gdy taki wyjatek zostanie rzucony. [domyslnie, debugger haltuje program gdy wyjatek zostanie rzucony i nie bedzie zlapany. ja teraz mowie o samym fakcie RZUCENIA wyjaktu. visual studio -> menu debug -> exceptions... -> wybrac wlasciwy z listy i zaznaczyc opcje 'thrown']

ale szczerze, mozliwosci jest tyle, ze pozostaje niestety przesledzic recznie co takiego ow writevalue probuje wsrodku faktycznie zrobic na zrodle danych. mozeliwe na przyklad, ze zrodlo w ogole jest niepoprawne albo ze bindingsource'y raczyly sobie zcacheowac nie te obiekty zrodlowe co nalezalo

btw. jestes absolutnie pewien, ze musisz recznie wykonywac writevalue? zwykle, po poprawnym (czytaj: 'normalnym' w sensie zamysly autorow databindingu) skonstruowaniu zrodel danych na formatce, wartosci laduja i zapisuja z powrotem sie same. autentycznie, jeden raz w zyciu musialem uzyc WriteValue - ale to bylo w momencie gdy znalazlem blad we wspolpracy kontrolek DevExpress a WinForms i w ogole musialem bardzo wiele rzeczy w silniku databindingu hym.. zoverrideowac

0

Witam,

Rozwiązanie już znalazłem. Problem nie leży po stronie niepoprawnie działającego wiązania, jest natomiast związany z poprawnym zachowaniem się mechanizmu, czyli standardowo po zmianie wartości wiązania wywoływane jest zdarzenie ListChangedEvent. Wystarczy zatem wyłączyć (a jest taka możliwość) wywoływanie zdarzenia:

bindingSource.RaiseListChangedEvents = false;

textBoxPaletteName.DataBindings["Text"].WriteValue();
textBoxPaletteDescription.DataBindings["Text"].WriteValue();

bindingSource.RaiseListChangedEvents = true;

tw. jestes absolutnie pewien, ze musisz recznie wykonywac writevalue? zwykle, po poprawnym (czytaj: 'normalnym' w sensie zamysly autorow databindingu) skonstruowaniu zrodel danych na formatce,

Tak, jestem pewien. Jest to jedyny znany mi sposób by zaimplementować obsługę cofania zmian CancelEdit() dla customowych obiektów bez konieczności implementowania interfejsu IEditableObject. Dzięki temu użytkownik może kliknąć "Zapisz zmiany" lub "Anuluj zmiany" i w zależności od akcji aktualizuję ręcznie źródło danych bądź też nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1