DataGridView zeigt geänderte Daten nicht an

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    DataGridView zeigt geänderte Daten nicht an

    Hallo zusammen!

    Ich oute mich als (bisher) stiller Mitleser! :)

    Das Forum hat mir schon bei sehr vielen (Anfänger-) Fragen geholfen. Dafür vielen Dank!
    Leider komme ich nun bei einem Punkt nicht weiter und bin schon seit Stunden am probieren. Ich kann jedoch leider die Ursache nicht eingrenzen.

    Hintergrund (vielleicht etwas weit ausgeholt):
    Ich habe auf Tabs jeweils einen DataGridView. Diesen fülle ich mit einer Datenbank Abfrage. Was auch prima funktioniert.
    Nun füge ich in dem gleichen Sub 4 neue Spalten hinzu, welche ich jetzt gerne mit anderen Daten füllen möchte.

    Aber genau da ist mein Problem. Ich habe mehrere Möglichkeiten zum Zellen beschreiben ausprobiert:

    VB.NET-Quellcode

    1. fDGV.Rows(i).Cells(fDGV.Columns("LLE Referenz").Index).Value = "LLE - " & strLLEReferenz

    oder

    VB.NET-Quellcode

    1. fDGV.Item(fDGV.Columns("LLE Referenz").Index, i).Value = "LLE - " & strLLEReferenz


    Das Erstellen eines neuen Tabs und das Füllen geschieht hier:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. strSQL = "Select ...."
    2. Dim dtAdapter = New DataTable
    3. dtAdapter.Load(SQL.abfragenStarten(strSQL)) 'Abfrage Starten und einem DataTable zuweisen, um die Daten direkt in den DataGridView einzufügen.
    4. ' ### Neuer Tab erstellen ###
    5. 'Fügt dem Tab eine neue Seite hinzu. Als Vorlage wird "TabPageVorlage" genutzt.
    6. Dim newTabPage As New TabPage
    7. Dim newControl As New TabPageVorlage
    8. newControl.Location = New System.Drawing.Point(0, 0)
    9. newControl.Dock = DockStyle.Fill
    10. newTabPage.Controls.Add(newControl)
    11. tcKalkulationen.TabPages.Add(newTabPage)
    12. '// ### Neuer Tab erstellen ###
    13. Dim fDGV As New System.Windows.Forms.DataGridView
    14. fDGV = DirectCast(newTabPage.Controls.Item(0).Controls("dgvDaten"), System.Windows.Forms.DataGridView) 'Referenziert auf den DataGridView
    15. fDGV.DataSource = dtAdapter 'Füllt den DataGrid View mit den Daten aus der Abfrage
    16. dtAdapter = Nothing 'Adapter wieder leeren, ansonsten werden nur die neuen Daten unten angeschrieben.
    17. SQL.myConn.Close() 'Nachdem die Abfragewerte genutzt wurden, die Verbindung beenden.


    Der Bereich wo ich in den DataGridView schreibe sieht wie folgt aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For i = 0 To fDGV.Rows.Count - 1
    2. If Not String.IsNullOrEmpty(fDGV.Rows(i).Cells("Hauptlieferant").Value.ToString) Then 'Wenn Hauptlieferant angegeben ist, dann...
    3. strLLEReferenz = ""
    4. If Funktionen.artikel_LLE_gültig(fDGV.Rows(i).Cells("Ressflach").Value.ToString, fDGV.Rows(i).Cells("Hauptlieferant").Value.ToString, strDatum, Me.lblZielLand.Text.ToString, strLLEReferenz) Then 'LLE ABfragen
    5. 'fDGV.Rows(i).Cells(fDGV.Columns("LLE Referenz").Index).Value = "LLE - " & strLLEReferenz 'Schreiben scheint nicht zu funktionieren
    6. fDGV.Item(fDGV.Columns("LLE Referenz").Index, i).Value = "LLE - " & strLLEReferenz
    7. MsgBox("TEST: " & fDGV.Rows(i).Cells(fDGV.Columns("LLE Referenz").Index).Value.ToString & " - " & newTabPage.Text.ToString)
    8. Else
    9. 'fDGV.Rows(i).Cells("LLE Referenz").Value = ""
    10. fDGV.Item("LLE Referenz", i).Value = "" ' LLE Referenz
    11. End If
    12. SQL.myConn.Close() 'Nachdem die Abfragewerte genutzt wurden, die Verbindung beenden.
    13. End If
    14. Next i


    beides führt zu dem Ergebnis, dass ich auch das Geschriebene als Ergebnis in einer Msgbox angezeigt bekomme, diese gleich nach dem Schreibvorgang angezeigt wird.

    Soweit so gut. Dann wäre der Sub auch schon am Ende.
    Jetzt wird in dem DataGridView jedoch nichts angezeigt. Auch wenn ich die vorher befüllten Felder abfrage, dann ist der Value der Zelle Nothing ?(

    Meine Vermutung/Ansätze bisher:
    • Falsche DataGridView ausgewählt - Stimmt nicht, es wird der korrekte DGV angesprochen.
    • Refresh und Update des DGV - Hat keinen Effekt darauf.
    • Komischerweise haben viele Spalten und Zellen einen Schreibschutz - Es sind aber nicht die von mir beschrieben Spalten/Zellen betroffen.

    Ich finde keinen weiteren Ansatzpunkt mehr auf mein Problem.

    Ich hoffe hier auf weitere Ansätze oder die (hoffentlich doch einfache) Lösung.

    Danke für Eure Hilfe!

    Grüße aus Hessen
    Jan
    Mal so schnell in den virtuellen Raum reinspekuliert, da ich grad on the fly bin: Du bindest ein DGV an eine DataTable und versuchst dann, das DGV direkt zu manipulieren. Nope, falscher Ansatz. Du musst die zugrundeliegende DataTable manipulieren. Sonst werden die Änderungen wahrscheinlich verworfen. In einem DGV werden Daten angezeigt, nicht manipuliert. Wenn Du in eine Zelle eines DataTable-gebundenen DGV was reinschreibst, wird der Inhalt der DataTable verändert. Folglich: Nicht dem DGV Spalten hinzufügen, sondern der DataTable.
    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.
    Guten Morgen VaporiZed,
    vielen Dank für Deinen Ansatz. Ich habe vermutet, dass ich durch folgende Zeile die Daten als ungebunden im DGV habe:

    VB.NET-Quellcode

    1. dtAdapter = Nothing​



    Was mich aber wundert ist, dass wenn ich nur die Userform so fülle, jedoch die Bearbeitung der Daten mit einem Button anstoße, dass meine Änderungen tatsächlich auch angezeigt werden.
    Das würde doch eher gegen den Ansatz sprechen, oder?

    Den Ansatz will ich aber gerne umsetzen:
    Jetzt müsste ich meinen Code so umschreiben, dass mein DataTable erhalten bleibt. Da ich aber x mögliche DataGridViews haben kann, müsste ich auch so viele DataTables haben.
    Als Möglichkeit würde mir einfallen, dass ich den jeweiligen DataTable in ein Array speichere.
    Tab (0) = Array (0) -> DataTable zu 0

    Wäre das Vorgehen okay oder verlangsame ich dadurch alles?

    Grüße Jan
    Langsam. Wir machen das mal Schritt für Schritt.
    • Du erstellst doch schon jeweils eine DataTable, siehe Post#1, Spoiler, Zeile 3. Und bindest das DGV an diese Tabelle -> die DataTable wär darüber immer erreichbar und ein DataTable-Array nicht zwangläufig nötig
    • Ich hab mal was geschrieben, Achtung nur zu Testzwecken!

    VB.NET-Quellcode

    1. Static Index As Integer = 1
    2. Dim DataTab As New Data.DataTable
    3. DataTab.Columns.Add("Test" & Index.ToString)
    4. DataTab.Rows.Add("Test")
    5. Dim TabSite As New TabPage
    6. TabSite.Text = "bla" & Index.ToString
    7. Dim DGV As New DataGridView
    8. DGV.Dock = DockStyle.Fill
    9. DGV.DataSource = DataTab
    10. TabSite.Controls.Add(DGV)
    11. TabControl1.TabPages.Add(TabSite)
    12. Index += 1
    13. DGV.Columns.Add("Test", "sadf")
    14. 'DGV.DataSource = Nothing

    Also: DataTable, DGV, TabPage erstellen, alles setzen und verbinden, dem DGV ne Spalte hinzufügen. Hinzufügen klappt nur, solange die letzte Zeile auskommentiert bleibt. Denn ansonsten verliert das DGV seine Datenquelle und ist leer! Kannst Du das mit Deinem Code bestätigen?
    Denn: Ich hab keine SQL-DB und Dim newControl As New TabPageVorlage sagt mir auch nix bzw. versteh ich nicht die Notwendigkeit.
    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.
    Ich habe leider meinen Code direkt aus einer Schleife genommen.
    Hier die Schleife in etwas abgespeckter Form:
    Zeile 2 bis 8 dienen nur dazu, dass ich meine SQL Abfrage erstellen kann.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For x = 0 To arPos.Count - 2
    2. strArtikel = ""
    3. For U = CInt(arPos(x)) + 1 To CInt(arPos(x + 1)) - 1
    4. strArtikel = strArtikel & "'" & Replace(lbHSL.Items(U).ToString, "-> ", "") & "'"
    5. If Not U = CInt(arPos(x + 1)) - 1 Then strArtikel = strArtikel & ","
    6. Next U
    7. strHSLArtikel = Replace(lbHSL.Items(CInt(arPos(x).ToString)).ToString, "=> ", "")
    8. strSQL = "Select..."
    9. Dim dtAdapter = New DataTable
    10. dtAdapter.Load(SQL.abfragenStarten(strSQL)) 'Abfrage Starten und einem DataTable zuweisen, um die Daten direkt in den DataGridView einzufügen.
    11. ' ### Neuer Tab erstellen ###
    12. 'Fügt dem Tab eine neue Seite hinzu. Als Vorlage wird "TabPageVorlage" (UserControl) genutzt.
    13. Dim newTabPage As New TabPage
    14. Dim newControl As New TabPageVorlage
    15. newControl.Location = New System.Drawing.Point(0, 0)
    16. newControl.Dock = DockStyle.Fill
    17. newTabPage.Controls.Add(newControl)
    18. tcKalkulationen.TabPages.Add(newTabPage)
    19. '// ### Neuer Tab erstellen ###
    20. Dim fDGV As New System.Windows.Forms.DataGridView
    21. fDGV = DirectCast(newTabPage.Controls.Item(0).Controls("dgvDaten"), System.Windows.Forms.DataGridView) 'Referenziert auf den DataGridView
    22. fDGV.DataSource = dtAdapter 'Füllt den DataGrid View mit den Daten aus der Abfrage
    23. dtAdapter = Nothing 'Adapter wieder leeren, ansonsten werden nur die neuen Daten unten angeschrieben.
    24. SQL.myConn.Close() 'Nachdem die Abfragewerte genutzt wurden, die Verbindung beenden.
    25. ' ### Daten füllen ###
    26. newTabPage.Text = strHSLArtikel 'Tab Bezeichnung festlegen
    27. 'Ausblenden der nicht benötigten Spalten, um Übersichtlichkeit zu schaffen.
    28. fDGV.Columns("Matchcode").Visible = False
    29. fDGV.Columns("aufl").Visible = False
    30. fDGV.Columns("Ebene1").Visible = False
    31. fDGV.Columns("E1aufl").Visible = False
    32. fDGV.Columns("Ebene2").Visible = False
    33. fDGV.Columns("E2aufl").Visible = False
    34. fDGV.Columns("Ebene3").Visible = False
    35. fDGV.Columns("E3aufl").Visible = False
    36. fDGV.Columns("Ebene4").Visible = False
    37. fDGV.Columns("E4aufl").Visible = False
    38. fDGV.Columns("Ebene5").Visible = False
    39. fDGV.Columns("E5aufl").Visible = False
    40. fDGV.Columns("Ebene6").Visible = False
    41. fDGV.Columns("E6aufl").Visible = False
    42. fDGV.Columns("ResTyp_MatArt").Visible = False
    43. fDGV.Columns("MatchcodePos").Visible = False
    44. fDGV.Columns("Menge_ges").Visible = False
    45. fDGV.Columns("KEKPos").Visible = False
    46. 'Spalte in DataGridView einfügen
    47. fDGV.Columns.Add("Mat", "Mat")
    48. fDGV.Columns.Add("FF", "FF")
    49. fDGV.Columns.Add("Lohn", "Lohn")
    50. fDGV.Columns.Add("LLE Referenz", "LLE Referenz")
    51. ' ### LLEs überprüfen ###
    52. 'DataGridView durchlaufen und die Artikel abfragen
    53. strDatum = Date.Today.ToString
    54. fDGV.ReadOnly = False
    55. For i = 0 To fDGV.Rows.Count - 1
    56. If Not String.IsNullOrEmpty(fDGV.Rows(i).Cells("Hauptlieferant").Value.ToString) Then 'Wenn Hauptlieferant angegeben ist, dann...
    57. strLLEReferenz = ""
    58. If Funktionen.artikel_LLE_gültig(fDGV.Rows(i).Cells("Ressflach").Value.ToString, fDGV.Rows(i).Cells("Hauptlieferant").Value.ToString, strDatum, Me.lblZielLand.Text.ToString, strLLEReferenz) Then 'LLE ABfragen
    59. 'fDGV.Rows(i).Cells(fDGV.Columns("LLE Referenz").Index).Value = "LLE - " & strLLEReferenz 'Schreiben scheint nicht zu funktionieren
    60. fDGV.Item(fDGV.Columns("LLE Referenz").Index, i).Value = "LLE - " & strLLEReferenz
    61. 'MsgBox("TEST: " & fDGV.Rows(i).Cells(fDGV.Columns("LLE Referenz").Index).Value.ToString & " - " & newTabPage.Text.ToString)
    62. Else
    63. 'fDGV.Rows(i).Cells("LLE Referenz").Value = ""
    64. fDGV.Item("LLE Referenz", i).Value = "" ' LLE Referenz
    65. End If
    66. SQL.myConn.Close() 'Nachdem die Abfragewerte genutzt wurden, die Verbindung beenden.
    67. End If
    68. Next i
    69. newTabPage = Nothing
    70. newControl = Nothing
    71. fDGV = Nothing
    72. Next x

    Darin nutze ich immer den gleichen DataTable um meine neu erstellten DGVs auf meinen TabPages zu füllen. Mein DataTable setze ich danach auf Nothing, da ansonsten die neuen Abfrageergebnisse einfach "unten" angeschrieben werden und ich somit nicht einfach den nächsten DGV füllen könnte.

    Meine Form ist etwas komplizierter aufgebaut:
    Ich habe verschiedene Kalkulationen von Artikeln. Jede Kalkulation soll getrennt betrachtet werden, sodass ich für jede Kalkulation einen Tab in einer TabControl erstelle.
    Auf diesem Tab ist dann ein DataGridView und diverse Textboxen und Labels. Die Schaltflächen sind auf einer UserControl festgelegt, diese ich dann dem Tab zuweise.

    Das passiert hier:

    VB.NET-Quellcode

    1. ' ### Neuer Tab erstellen ###
    2. 'Fügt dem Tab eine neue Seite hinzu. Als Vorlage wird "TabPageVorlage" (UserControl) genutzt.
    3. Dim newTabPage As New TabPage
    4. Dim newControl As New TabPageVorlage
    5. newControl.Location = New System.Drawing.Point(0, 0)
    6. newControl.Dock = DockStyle.Fill
    7. newTabPage.Controls.Add(newControl)
    8. tcKalkulationen.TabPages.Add(newTabPage)


    Deswegen auch mein

    VB.NET-Quellcode

    1. Dim newControl As New TabPageVorlage
    , da ich so mein UserControl auf den Tab bekomme.

    Deinen Code kann ich bestätigen. Es scheint also am DataTable zu liegen.
    Wiederum verstehe ich dann nicht, warum es bei mir funktioniert, wenn ich meine Schleife durchlaufen lasse und erst wenn die Userform erstellt ist, durch einen Button die Infos in den DGV schreibe.
    Da sollte es doch dann eigentlich auch nicht gehen?

    Auch werden die Spalten die ich hinzufüge angezeigt. Diese füge ich ja auch nur den DGV zu und nicht dem DataTable (Zeile 59 bis 62).

    Grüße Jan
    Langsam.

    Sutarex schrieb:

    Darin nutze ich immer den gleichen DataTable um meine neu erstellten DGVs auf meinen TabPages zu füllen. Mein DataTable setze ich danach auf Nothing, da ansonsten die neuen Abfrageergebnisse einfach "unten" angeschrieben werden und ich somit nicht einfach den nächsten DGV füllen könnte.


    Nein. Ich tippe auf Vermutungsfehler.

    VB.NET-Quellcode

    1. For x = 0 To arPos.Count - 2
    2. '...
    3. Dim dtAdapter = New DataTable
    4. '...
    5. Next

    auch wenn hier immer die selbe Variable dtAdapter verwendet wird, wird immer eine komplett neue DataTable erstellt. Beispiel:

    VB.NET-Quellcode

    1. Dim dt As Data.DataTable = Nothing
    2. Dim ColumnCount = 0
    3. For i = 1 To 10
    4. dt = New Data.DataTable
    5. dt.Columns.Add("asd")
    6. ColumnCount = dt.Columns.Count
    7. Stop
    8. Next

    Hier werden 10 verschiedene DataTables erstellt und im RAM abgelegt. Einfacher Beweis: ColumnCount ist immer 1, da nur zur frisch erstellten DataTable-Instanz eine Column hinzugefügt wird. Es entsteht nicht 1 Tabelle mit 10 Spalten, sondern 10 Tabellen mit je 1 Spalte. Daher ist das bei Dir mit dem dtAdapter = Nothing weder etwas sinnvolles noch etwas, was Du wirklich willst. Du vernichtest mit "= Nothing" Deine DGV-Quelle. Deinen Restcode schau ich mir später noch an.
    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.
    Du hast natürlich recht.Ich hatte heute zum testen die Deklaration vor der Schliefe stehen und oh Wunder, mir wurden keine Daten im DGV angezeigt... Ich hatte es da nur auf einen anderen Fehler von mir bezogen... da hätte ich natürlich schon schalten müssen. Danke!Mich wundert dann aber auch, warum es keine Auswirkung hat, dass ich mitten im Code

    VB.NET-Quellcode

    1. dtAdapter = Nothing
    mache. Dann dürfte doch da auch nichts mehr angezeigt werden. Es wird aber weiterhin etwas angezeigt.

    Jetzt noch meine Frage wie ich dann weiter machen muss:
    Ich habe nun alles erstmal so umgeschrieben, dass ich den DataTable verändere. Das funktioniert.

    Aber wie spreche ich denn dann später meinen DataTable von Tab x an, wenn alle erstellt wurden?
    Nun, in jedem Tab ist ein DGV. Und jedes DGV hat seine eigene DataSource, so hattest Du es festgelegt. Und zwar ist die DataSource die DataTable.
    Jetzt musst Du also nur die DataSource (Typ ist Objekt) in eine DataTable umwandeln. Und das geht mittels:
    Dim CurrentDataTable = DirectCast(dgv.DataSource, Data.DataTable)
    Und schon hast Du Deine konkrete DataTable-Instanz, in der Du schreiben und rumarbeiten kannst, wie Du möchtest.

    Nochwas zu Deinem Erstellungscode: Bei

    VB.NET-Quellcode

    1. Dim fDGV As New System.Windows.Forms.DataGridViev

    erstellst Du eine komplett neue DGV-Instanz und speicherst sie in der Variable fDGV, nur um fDGV mit ...

    VB.NET-Quellcode

    1. fDGV = DirectCast(newTabPage.Controls.Item(0).Controls("dgvDaten"), System.Windows.Forms.DataGridView) 'Referenziert auf den DataGridView

    in der nächsten Zeile fDGV durch ein vorhandenes DGV zu ersetzen. Das ließe sich so kürzen, dass Punkt 1 rausfliegt:

    VB.NET-Quellcode

    1. Dim fDGV = DirectCast(newTabPage.Controls.Item(0).Controls("dgvDaten"), System.Windows.Forms.DataGridView)

    Ich weiß ja nicht, was Dein UserControl alles enthält, aber ich hoffe, dass es mehr als nur ein DGV namens dgvDaten sein wird, richtig?

    Es ist interessant: Der (abgewandelte) bisherige Code

    VB.NET-Quellcode

    1. Dim fDGV = DirectCast(newTabPage.Controls.Item(0).Controls("dgvDaten"), System.Windows.Forms.DataGridView)
    2. fDGV.DataSource = dtAdapter
    3. dtAdapter = Nothing

    führt zu dem Phänomen, dass trotz der letzten Zeile die Daten erhalten bleiben. btw: ohne das dtAdapter = Nothing entstehen in den folgenden DGVs auch nicht mehr Daten. Wenn ich aber folgendes dranhänge:

    VB.NET-Quellcode

    1. fDGV.DataSource = dtAdapter

    sind die Daten weg. Oder ich setze die DataSource einfach direkt auf Nothing. Eigentlich müsste das auch schon in Deiner Variante so laufen.
    Interessant ist gerade, dass das DGV sich ändert, wenn ich nach Deinem fDGV.DataSource = dtAdapter die DataTable (also dtAdapter) ändere, indem ich weitere Spalten einfüge. Wenn ich aber dtAdapter.Dispose() oder dtAdapter = Nothing mache, passiert nix.
    Aber die Ursachensuche ist mir jetzt zu spät, ich schau morgen nochmal.
    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.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Mir ist grad in den Sinn gekommen, dass da wohl der Garbage Collector dran schuld sein könnte:

    VB.NET-Quellcode

    1. fDGV.DataSource = dtAdapter
    2. dtAdapter = Nothing


    dtAdapter wird nun zum Abschuss freigegeben. Aber der Garbage Collector frisst nur Daten, die keine bestehende Verbindung mehr zu anderen Objekten hat. Da fDGV.DataSorce aber noch mit den Daten von dtAdapter verbunden ist, bleiben die Daten von dtAdapter erstmal erhalten, eben bis fDGV.DataSorce was anderes zugewiesen bekommt und die Daten niemand mehr braucht. Wäre meine Theorie. Vielleicht fällt jemandem noch was sinnvolleres ein.
    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.
    Hallo VaporiZed,

    sorry für die späte Rückmeldung. Leider war ich am Wochenende verhindert.

    Danke für Deine Hilfe. Habe es mit Zugriff dann mit dem Verweis auf die DataSource gelöst.

    Du hast natürlich auch recht mit dem Einsparen der Zeile... habe es geändert.

    Wie Du auch richtig vermutet hast, besteht meine UserControl neben den DGV noch aus 30 TextBoxen.

    Die Erläuterung mit dem Carbage Collector ist für mich auch vollkommen nachvollziehbar. Ich muss aber gestehen, dass ich von selbst nie auf diesen Grund gekommen wäre.

    Vielen Dank für Deine Hilfe!

    Grüße Jan


    VB.NET-Quellcode

    1. ​ fDGV.DataSource = dtAdapter 'Füllt den DataGrid View mit den Daten aus der Abfrage
    2. Dim CurrentDataTable = DirectCast(fDGV.DataSource, Data.DataTable) 'Referenziert auf den DataTable, der dem DataGridView zugewiesen ist.[vbnet]​
    [/vbnet]
    na, das hier

    VB.NET-Quellcode

    1. fDGV.DataSource = dtAdapter 'Füllt den DataGrid View mit den Daten aus der Abfrage
    2. Dim CurrentDataTable = DirectCast(fDGV.DataSource, Data.DataTable) 'Referenziert auf den DataTable, der dem DataGridView zugewiesen ist.
    ist bischen Unfug mit dem DirectCast - einfacher wäre so:

    VB.NET-Quellcode

    1. fDGV.DataSource = dtAdapter 'Füllt den DataGrid View mit den Daten aus der Abfrage
    2. Dim CurrentDataTable = dtAdapter 'Referenziert auf den DataTable, der dem DataGridView zugewiesen ist.
    Weil fDGV.DataSource und dtAdapter ist ja dasselbe Objekt.
    Das mit dem GarbageCollector habich nicht verstanden - was erklärt sich durch dessen Tätigkeit?
    @ErfinderDesRades: Das mit dem GC ist ein Spekulatius von mir, denn ich konnte mir anders folgendes Verhalten nicht erklären:
    Gegeben sei ein leeres DGV, welches durch folgenden Code modifiziert wird:

    VB.NET-Quellcode

    1. Dim dt As New Data.DataTable
    2. dt.Columns.Add("Test")
    3. DataGridView1.DataSource = dt
    4. dt = Nothing

    Ich könnte mir ohne die GC-Geschichte aus Post#9 nicht erklären, waum das DGV seine Column behält. Setzt man noch ne Zeile dran, und zwar egal ob nochmal DataGridView1.DataSource = dt oder eben DataGridView1.DataSource = Nothing, dann ist das DGV wieder spaltenfrei. Allerdings hätte ich schon durch den o.g. Code ein leeres DGV erwartet, eben weil ja DataGridView1.DataSource auf dt verweist und dt nun Nothing gesetzt wurde.

    EDIT: Es käme natürlich bei DataGridView1.DataSource = dt eine deep copy infrage, fällt allerdings deshalb flach, da eine Veränderung von dt nach der Zuordnung zu DataGridView1.DataSource ebenfalls Änderungen im DGV auslöst.
    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.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    VaporiZed schrieb:

    Ich könnte mir ohne die GC-Geschichte aus Post#9 nicht erklären, waum das DGV seine Column behält.
    Dann hast du das Wesen einer Zuweisung noch nicht ganz verinnerlicht.
    Nach der Zuweisung zeigt die Property DGV.DataSource auf dasselbe Objekt wie dt.
    Wenn du anschließend dt auf Nothing setzt stört das das DGV einen Kehricht - DGV.DataSource zeigt nachwievor auf das Objekt wo vorher dt drauf gezeigt hat.
    Ehm ... ja. Guten Morgen, VaporiZed. Hab selber vor ein paar Jahren mit C++ gearbeitet, spätestens da sollte noch Restwissen von pointer-Geschichten da sein :S
    • Pointer 1 und Pointer 2 zeigen auf eine Objektadresse
    • ändert man das Objekt mittels Pointer 1, wird das natürlich bei Pointer 2 mit angezeigt, da auf dieselbe Adresse und somit auf's gleich Objekt gezeigt wird
    • setzt man Pointer 1 auf NULL, zeigt Pointer 2 ja immer noch auf das Objekt

    @ErfinderDesRades: danke
    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.