Datagridview bekommt keine Daten aus der Bindingsource

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Datagridview bekommt keine Daten aus der Bindingsource

    Hallo,

    ich habe den ganzen Tag damit verbracht, Themen über Datagridview und das Sortieren mehrerer Spalten durchzulesen.
    Folgendes habe ich hoffentlich verstanden:

    Ein Datagridview wird über eine Bindingsource mit einer Datenquelle verbunden.
    Die Datenquelle kann nach mehreren Spalten sortiert werden, um das Ergebnis dann automatisch im Datagridview anzuzeigen.

    Folgender Code soll meine Vorgehensweise veranschaulichen:

    VB.NET-Quellcode

    1. Dim Teilnehmerliste As New DataTable
    2. 'Die Teilnehmerliste wird mit dem Inhalt einer Datei gefüllt.
    3. Dim SortierteListe As New DataView(Teilnehmerliste)
    4. Dim Pufferliste As New DataGridView()
    5. Dim Verbindung As New BindingSource()
    6. SortierteListe.Sort = "Verein ASC, Ringe DESC, Teiler DESC"
    7. Verbindung.DataSource = SortierteListe
    8. Pufferliste.DataSource = Verbindung


    Beim Debuggen lasse ich mir die Anzahl der Listen anzeigen. Die Verbindung und die SortierteListe haben 174 Einträge. Die Pufferliste bleibt jedoch leer.

    Ich habe bei meiner Suche auch Beispiele 1zu1 übernommen, komme aber nicht auf den Fehler.

    Kennt Jemand den Fehler?
    Was ist Pufferliste und warum sollte sie als Quelle eine BindingSource haben? Und nicht einfach SortierteListe? Was glaubst Du denn, wird in Pufferliste mit Deinem Code am Ende drinstehen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Folgendes sollte in Code niemals auftauchen: new DataSet(), new DataTable(), new DataView(), new BindingSource(), new DataGridView().
    Wann immer eines davon auftaucht, wurde etwas grundlegend falsch gemacht.

    Erstell dir ein typisiertes Dataset, und zieh eine Tabelle davon aus dem Datenfenster aufs Form.
    Das generiert dir BindingSource, Datagridview und Dataset als DesignerCode, mit Datenbindung gleich richtig eingerichtet.
    Zum Sortieren dann nur noch die Sort-Property der gegebbenen BindingSource in geeigneter Weise setzen.

    gugge vier Views-Videos
    Hast du kein DataGridView auf deiner Form drauf?
    Falls doch, warum erstellst du dann zur Laufzeit ein 2.?

    Für mich sieht es so aus, als wenn die Daten deine Oberfläche (Form) nie erreichen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo,

    erst einmal Danke für die Antworten. Ich versuche mal das Programm etwas besser zu erklären:

    In einer TXT-Datei stehen Teilnehmer, die aus den Feldern
    Startnummer, Nachname, Vorname, Geschlecht, Verein, Ringe und Teiler
    zusammengesetzt sind.

    Beim Start des Programms wird diese Datei ausgelesen und in "Teilnehmerliste" eingetragen. Klickt man auf die Schaltfläche "Ergebnisse" im Hauptmenü, öffnet sich ein Formular, welches mehrere Datagridviews nach Geschlecht sortiert anzeigt. Es gibt eine View für Jugend, eine für Damen und eine für Herren. In jeder View sollen die Mannschaften zusammengefaßt werden.

    Daher werden zuerst alle Teilnehmer in die Dataview "SortierteListe" übertragen. Diese wird dann zuerst nach Verein, dann nach Ringe und schließlich nach Teiler sortiert.

    Zum Schluß werden die Daten in einer Schleife in die entsprechenden Views übertragen. Dabei werden die drei Besten eines Vereins zusammengefaßt, um diesen Verein je nach Geschlecht in seine Liste einzutragen.
    Am Ende sieht der Benutzer drei Auflistungen. Jugendvereine, Damenvereine und Herrenvereine.

    Ich habe mich für eine TXT-Datei entschieden, da diese auch manuell sehr einfach angepaßt werden kann.

    Ich hoffe, daß ich mich verständlich ausgedrückt habe.

    Vielen Dank schon im Voraus für eure Unterstützung.

    mrMo schrieb:

    Hast du kein DataGridView auf deiner Form drauf?
    Falls doch, warum erstellst du dann zur Laufzeit ein 2.?

    Für mich sieht es so aus, als wenn die Daten deine Oberfläche (Form) nie erreichen.

    Haste das bei dir mal geprüft?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo,
    ich habe auf meiner Form 3 Datagridviews. Eine für Vereine Jugend, die Zweite für Verein Damen und die Dritte für Vereine Herren. Das erstellte Datagridview enthält alle Teilnehmer. Diese sollen dann nach Verein sortiert auf die drei sichtbaren verteilt werden. Beim Ausführen erscheint keine Fehlermeldung, aber auch keine Vereine. Ich überwache die Anzahl der Datensätze in "SortierteListe", in "Verbindung" und in Pufferliste. "Sortierte" und "Verbindung" haben jeweils die gleiche Anzahl von Datensätzen. "Pufferliste" bleibt leider leer.

    Ich habe auch schon ein Beispiel aus eihnem Forum 1zu1 getestet. Dabei habe ich nur die Namen angepaßt.

    VB.NET-Quellcode

    1. Dim Pufferliste As New DataGridView()
    2. Dim Verbindung As New BindingSource()
    3. Dim LT As New List(Of String)
    4. LT.Add("ABC")
    5. LT.Add("DEF")
    6. LT.Add("GHI")
    7. Verbindung.DataSource = LT
    8. Pufferliste.DataSource = Verbindung


    Auch hier hat LT und Verbindung die gleiche Anzahl von Einträgen, während Pufferliste leer bleibt. Gibt es vielleicht eine Eigenschaft der Bindingsource, die gesetzt werden muß, um die Daten weiterzugeben?

    LG

    tron25 schrieb:

    ich habe auf meiner Form 3 Datagridviews.
    Welches davon ist dieses?

    tron25 schrieb:

    VB.NET-Quellcode

    1. Dim Pufferliste As New DataGridView()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die sichtbaren Datagridviews auf meiner Form lauten:
    VereineJugendListe
    VereineDamenListe
    VereineHerrenListe

    Das Datagridview "Pufferliste" wird erzeugt, um alle Vereine nach Ringe und dann nach Teiler sortiert anzuzeigen. Die drei sichtbaren Datagridviews sollen dann die Vereine nach Ringe sortiert anzeigen. Dabei werden alle Teilnehmer eines Vereins zusammengefaßt, sodaß jeder Verein nur einmal vorkommt.

    Habe ich die folgenden Zusammenhänge richtig verstanden?

    1. Das Dataview "SortierteListe" enthält in meinem Beispiel alle Datensätze von "Teilnehmerliste"
    2. Die Bindingsource "Verbindung" hat Zugriff auf alle Datensätze von "SortierteListe" und kann somit lesen, schreiben, bearbeiten, hinzufügen und löschen.
    3. Das Datagridview "Pufferliste" bezieht seine Daten von "Verbindung" und kann somit über "Verbindung" Daten in "SortierteListe" bearbeiten.
    4. Ein Datagridview kann nur nach einer Spalte sortiert werden, daher ist für eine mehrspaltige Sortierung ein Dataview notwendig.

    Habe ich da etwas falsch verstanden?

    Die meisten Beispiele in diesem Forum beziehen ihre Daten aus einer XML-Datei und haben statt eines Dataviews eine Datatable. In meinem Fall sollen aber die Daten aus "Teilnehmerliste", eines weiteren Dataviews kommen. Liegt vielleicht dort das Problem?

    LG

    tron25 schrieb:

    Ein Datagridview kann nur nach einer Spalte sortiert werden, daher ist für eine mehrspaltige Sortierung ein Dataview notwendig.
    Mit einem eigenen Sorter kannst Du das DGV nach allen seinen Spalten sortieren.
    Ich habe das Gefühl, dass Du in Deinen Instanzen keinen Durchblick (mehr) hast.
    Mach das so, wie es der @ErfinderDesRades vorgeschlagen hat.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe mir die MSDN zu typisierten Datasets durchgelesen. So, wie ich es verstanden habe, bekommt ein Dataset eine Datenbank als Quelle. Ich habe jedoch keine Datenbank, sondern ein Datagridbiew "Teilnehmerliste" mit den Daten. Dieses Datagridview wird beim Programmstart erzeugt und aus den Daten einer TXT-Datei gefüllt. So, wie ich das sehe, liegt das Problem darin, wie die Bindingsource seine Daten an das Datagridview "Pufferliste" weiterleitet, bzw. Pufferliste die Daten von Bindingsource holt.

    Das Dataview "SortierteListe" holt sich korrekt die Daten von "Teilnehmerliste". Die Bindingsource "Verbindung" wird ebenfalls korrekt mit "SortierteListe" verbunden. Es gibt lediglich ein Problem mit der Verbindung von "Pufferliste" zu "Verbindung". Ich dachte, das

    VB.NET-Quellcode

    1. Pufferliste.datasource = Verbindung

    richtig sei.
    In den Beispielen, die ich bisher gefunden habe, wurde es syntaktisch auch so gemacht.

    ErfinderDesRades schrieb:

    Was ist damit gemeint?
    So was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub DataGridView1_ColumnHeaderMouseClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
    3. DataGridView1.Sort(New DgvComparerDate())
    4. End Sub
    5. End Class
    6. Class DgvComparerDate
    7. Implements IComparer
    8. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
    9. Dim Row1 As DataGridViewRow = CType(x, DataGridViewRow)
    10. Dim Row2 As DataGridViewRow = CType(y, DataGridViewRow)
    11. Dim name1 As String = Row1.Cells(0).Value.ToString
    12. Dim name2 As String = Row2.Cells(0).Value.ToString
    13. Dim value1 As Integer = CInt(Row1.Cells(1).Value)
    14. Dim value2 As Integer = CInt(Row2.Cells(1).Value)
    15. ' 1. Sortierung nach Spalte 0
    16. If name1 <> name2 Then
    17. Return name1.CompareTo(name2)
    18. End If
    19. ' 2. Sortierung nach Spalte 1
    20. Return value1.CompareTo(value2)
    21. End Function
    22. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    tron25 schrieb:

    Ich habe mir die MSDN zu typisierten Datasets durchgelesen.
    ich habe dir in post#3 einen Link gegeben.
    War der es nicht wert, aufgesucht zu werden?
    Weil ich sag ja nicht nur, mach so und so, sondern ich geb dir detaillierte Anleitung an Hand.

    Mit Msdn ist so: Alles was da steht ist richtig, aber es steht eben auch extrem viel Zeugs drinne, was viel einfacher ginge, und was kein Mensch mit Tassen im Schrank tatsächlich so ausführen würde, wies bei denen steht.



    @Rod:
    Wie gesagt: (was immer es ist...) Einfacher wäre:

    VB.NET-Quellcode

    1. DatagridView1BindingSource.Sort = "parentRowId, rowId"
    und den Sorter weglassen.
    Hat auch den Vorteil, dass man Daten über die Bindingsource auswerten kann, und nicht ins Dgv grabschen muss.
    Hi,

    ich habe mir deinen Artikel durchgelesen und auch ein Video angeschaut. Mein Problem ist, daß ich mit den Videos nicht viel anfangen kann, da ich einen Sehrest von ca. 5 % habe und einige Schritte nicht nachvollziehen kann, wenn auf eine Tabelle oder Bildausschnitt hingewiesen wird, ohne ihn genau zu beschreiben. Aber dafür kannst du ja nichts. Abgesehen davon finde ich die Videos gut für Leute, die normal sehen können.

    Zum Weiteren beschreibst du sehr viel in deinen Filmen, was mir bei der Lösung meines Problemes leider nicht weiterhilft.

    Zu guter Letzt möchte ich sagen, daß ich mein Problem gelöst habe, indem ich das Datagridview "Pufferliste" und die Bindingsource "Verbindung" mit dem Assistenten generiert habe. Am Code habe ich nichts geändert, außer, daß ich die Zeilen mit "DIM" herausgenommen habe. Dieser sieht nun so aus:

    VB.NET-Quellcode

    1. Dim SortierteListe As New DataView(Teilnehmerliste)
    2. Pufferliste.AutoGenerateColumns = True
    3. SortierteListe.Sort = "Verein ASC, Ringe DESC, Teiler DESC"
    4. Verbindung.DataSource = SortierteListe


    Trotzdem vielen Dank für deine und eure Hilfe.

    Ich wünsche allen ein frohes Fest und einen guten Rutsch
    Tja, sorry, auf Sehbehinderung nehmen die Vids keine Rücksicht, dassis richtig.

    tron25 schrieb:

    Zum Weiteren beschreibst du sehr viel in deinen Filmen, was mir bei der Lösung meines Problemes leider nicht weiterhilft.
    Dassis auch richtig.
    Ist halt ein allgemeines Tut, und versucht alles abzudecken, was mit dem Instrument Video sinnvoll abzudecken ist.

    Aber Ich hab dieselbe Vorgehensweise auch auf Englisch verzapft, sogar besser erklärt. Normal gucken die Leuts halt lieber Video, und es reicht sogar für den Anfang, wenn sie nur sehen, dass das so geht, und dasses einfach ist - auch ohne auf Anhieb und im einzeln zu verstehen (St. Exuperie: "Lehre den Menschen die Sehnsucht...")

    Also hier die Englische Tut-Reihe:
    codeproject.com/Articles/10309…l-Datamodel-for-Beginners
    Ich bin leider kein Held in Englisch. Trotzdem danke.

    Das Programm funktioniert zwar jetzt, aber es wurmt mich schon, warum es vorher nicht funktioniert hat. Wo liegt der Unterschied darin, ob ich ein Datagridview aus der Toolbox auswähle oder ob ich mit "DIM" eines erzeuge? Natürlich hat ein Datagridview viele Eigenschaften, die eventuell gesetzt werden müssen. Ich dachte bisher, daß ein Tool aus der Box die gleichen Standardeigenschaften gesetzt hat, wie Eines, welches mit "DIM" erzeugt wird. Klar gibt es da Ausnahmen, wie z.B. die Font-Eigenschaft, die sich nach dem Parent richtet, aber diese Eigenschaft dürfte keinen Einfluß darauf haben, ob das Programm funktioniert.

    Trotzdem nochmal vielen Dank für eure Hilfe.

    tron25 schrieb:

    Wo liegt der Unterschied darin, ob ich ein Datagridview aus der Toolbox auswähle oder ob ich mit "DIM" eines erzeuge?
    Das Toolbox-Control ist Member der Controls-Collection Deiner Form und somit "verdrahtet", das mit Dim erzeugte schwebt schwerelos im Raum.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!