2 Stimmen

DataGridView kann nicht über Linq to SQL aktualisiert werden (WinForm)

Das ist eine sehr merkwürdige Situation: Ich verwende L2S, um eine DataGridView zu befüllen.
Der Code folgt:

    private void RefreshUserGrid()
    {
    var UserQuery = from userRecord in this.DataContext.tblUsers
                    orderby userRecord.DisplayName
                    select userRecord;

    UsersGridView.DataSource = UserQuery;

//I have also tried
//this.UserBindingSource.DataSource = UserQuery;
//UsersGridView.Datasource = UserBindingSource;

    UsersGridView.Columns[0].Visible = false;
    }

Immer wenn ich L2S zum Hinzufügen/Löschen von Datensätzen aus der Datenbank verwende, wird die GridView problemlos aktualisiert.
Wenn jedoch jemand das Raster bearbeitet und einen Fehler macht, möchte ich, dass er eine Aktualisierungsschaltfläche drücken kann und seine Fehler durch erneutes Laden aus der Datenquelle gelöscht werden.
Ich kann es beim besten Willen nicht zum Laufen bringen.

Der Code, den ich derzeit für meine Aktualisierungsschaltfläche verwende, lautet wie folgt:

private void button1_Click(object sender, EventArgs e)
{
    this.DataContext.Refresh(RefreshMode.OverwriteCurrentValues);
    RefreshUserGrid();
}

Aber die verdammte GridView bleibt davon unberührt. Alles, was passiert, ist, dass die ausgewählte Zeile nicht mehr ausgewählt ist.

Ich habe versucht .Refresh() , .Invalidate() Ich habe versucht, die DataSource auf NULL zu ändern und wieder zurück (alle Vorschläge aus ähnlichen Beiträgen hier) ....none von es funktioniert. Das einzige Mal, wenn das Gitter aktualisiert wird, ist, wenn ich die App neu starten.

Ich muss etwas Grundlegendes übersehen haben, aber ich bin völlig ratlos, und meine Kollegen sind es auch.
Irgendwelche Ideen?

Merci !

1voto

ewrankin Punkte 253

Am einfachsten wäre es, eine BindingSource zu verwenden. Erstellen Sie eine Instanz der BindingSource in der Klasse initialisieren Sie es auf die Datenabfrage dann weisen Sie die BindingSource auf die UsersGridView.

Die BindingSource übernimmt die Aktualisierung usw. Es gibt mehrere Ereignisse, die für die benutzerdefinierte Verwaltung abgefangen werden können.

Dieser Link enthält ein Beispiel für die Verwendung einer BindingSource

EDIT: In meinem ersten Beitrag ging ich von Webforms und nicht von WinForms aus.

1voto

Taiwo A. Punkte 11

Es scheint, dass dies ein Fehler in LINQ to SQL ist. Ich habe von den Janus GridEx-Leuten erfahren, dass die Ursache des Problems darin liegt, dass LINQ dem Raster eine statische Liste präsentiert, die nicht aktualisiert wird, nachdem Refresh im DataContext aufgerufen wurde.

Eine Lösung besteht darin, den DataContext einfach neu zu instanziieren.

1voto

sachin patil Punkte 11

Sie können Raster aktualisieren indem Sie einfach neu initialisieren DataContext Objekt. Dadurch wird die aktuelle DataContext Objekt, das aktualisiert werden muss, aber neue Instanz werden automatisch die aktualisierten Werte übernommen.

0voto

Die vorstehenden Bemerkungen sind zutreffend. Wiederholen Sie die DataContext das Problem zu lösen

Dim db As New dbDatosDataContext()
DataGridView1.DataSource = From l In db.Bultos Select l

0voto

cyberponk Punkte 1343

Nachdem ich viele Methoden ausprobiert und mich fast für DataContext.Refresh entschieden hatte, fand ich diesen cleveren Trick, der den Cache löscht und so eine Datenaktualisierung erzwingt:

Public Sub ClearCache(Dcontext As DataContext)
    Const FLAGS = BindingFlags.Instance + BindingFlags.Public + BindingFlags.NonPublic
    Dim method = Dcontext.GetType().GetMethod("ClearCache", FLAGS)
    method.Invoke(Dcontext, Nothing)
End Sub

Fügen Sie diese Methode zu Ihrem Modul hinzu und aktualisieren Sie die Daten einfach:

ClearCache(DataContext)
UsersGridView.Refresh()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X