update z DataGridView, gdy w bazie zaszły zmiany

0

Witajcie,
Mam taki problem. Wczytuje sobie tabelę z bazy do DataGridView

dAdapt = new SqlDataAdapter("select * from tabela", cn);
invBuilder = new SqlCommandBuilder(dAdapt);
dAdapt.Fill(myDS, "tabela");
dataGridView1.DataSource = myDS.Tables["qut1"].DefaultView;

tabela elegancko mi się wyświetla. Robię sobie obsługę update, po wciśnięciu przycisku odpala się kod:

dataGridView1.Refresh();
dAdapt.Update(myDS, "tabela");

To też fajnie działa, ale do czasu.
Gdy ktoś zrobi update np. z poziomu bazy i podmieni mi wartość danego wiersza to w aplikacji nic już nie zdziałam. Np. Jest imię "Jan", ktoś zmienia w bazie na "Henryk", ja w aplikacji ustawiam "Marek", daję update i wyskakuje mi komunikat:
Naruszenie współbieżności: element UpdateCommand dotyczy następującej liczby rekordów: 0 (oczekiwana liczba rekordów: 1).

Wydaje mi się, że rozwiązaniem problemu będzie odświeżenie DataGridView, bo znajduje on rozbieżność pomiędzy tym co sam posiada, a tym co jest w bazie w momencie próby zrobienie Update. Może jestem w błędzie? W każdym razie idąc tym tropem trochę pogooglowałem i rozwiązań całe mnóstwo znalazłem, ale żadne nie działa. Wszelkiej maści:

dataGridView1.Invalidate();
dataGridView1.Refresh();
myDS.getChange();
dataGridView1.Parent = null;
suspendLayout();

itp.itd. nic nie dają (oczywiście to tylko przykładowe metody, nie wywoływane w podanej ilości i kolejności).

Może ktoś podpowie co zrobić z opisaną sytuacją? Może DataGridView wcale nie wymaga odświeżenia? (choć docelowo też go będę potrzebował).

0

Witam
Mam podobny problem. Czyżby po zapisaniu i w momencie wczytywania wiersza do edycji zawsze wykonywać metodę
dAdapt.Fill(myDS, "tabela");
??

0

Udało mi się rozwiązać problem, dla potomnych może przyda się ta odpowiedź, choć najpewniej do szczególnie eleganckich nie należy.

Okazało się, że myDS, czyli dataSet nie odświeża się (a może kolejne dataSety się dopisywały do niego na zasadzie listy?). W każdym razie, problem rozwiązałem tak:

myDS = new DataSet();
dAdapt.Fill(myDS, "table");
dataGridView1.DataSource = myDS.Tables["table"].DefaultView;

także rozwiązaniem okazała się ponowna definicja dataSeta. Ważne, że działa. Nie miało być elegancko, miało "działać".

Aha i dzięki wszystkim za nieocenioną pomoc ;)

0

A próbowałeś:

myDS.AcceptChanges() ?

Mi pomogło.

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