DataGridView-Formatierung wird gelöscht bei Aktualisierung der zugehörigen DataTable

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von roepke.

    DataGridView-Formatierung wird gelöscht bei Aktualisierung der zugehörigen DataTable

    Gleich vorneweg: das angehängte Proggi ist eine total abgespeckte Version des eigentlichen Programms um lediglich das Problem klarer zu machen.
    Auf meinem Form FGEditor gibt es die Möglichkeit in einem TabControl eine beliebige Anzahl von UserControls uc_FGEditor zu laden. (Eins je TabPage).
    Klicke ich auf dem FGEditor Form den Button „Calculate complete curve“ werden alles TabPages und deren UserControls der Reihe nach durchlaufen und auf dem jeweiligen UserControl eine Berechnung durchgeführt.
    Die Ergebnisse werden mittels DataTable sowohl auf dem UserControl selbst, als auch auf dem ParentForm in einem DataGridView angezeigt.
    Die DataGridView sind formatiert.
    Klicke ich anschließend auf einem UserControl den Button „Calculate this curve segment“, dann wird nur die Berechnung auf dem jeweiligen UserControl einzeln durchgeführt. Die anderen UserControls bleiben unberührt. Dabei wird auch die DataTable auf dem UserControl aktualisert.
    Auf dem UserControl wird der DataGridView erneuert, inkl. dessen Formatierung. Auf dem ParentForm werden die Daten des DataTable, der an den DataGridView gebunden ist dadurch auch ersetzt.
    Das zerstört mir aber die Formatierung des selbigen und ich verstehe nicht ganz warum.
    Durch Änderung der DataTable wird der DataGridView wohl zum neu zeichnen aufgefordert.
    Beim Anlegen der TabPage und des darauf befindlichen DataGridView kann ich ja mittels AddHandler ein Event des DataGridView abonnieren. (Zeile 148, FGEditor.vb)
    Aber was ist das für ein Ereignis?
    Oder bin ich voll auf dem Holzweg?
    Dateien
    Argh, Augenkrebs!
    Da wird das DGV von irgendeinem SubControl hergezerrt und in irgendeinen anderen Container auf dem MainForm verfrachtet. Dann mit Daten befüllt und dann noch formatiert. Und dann irgendwann wieder mit Daten befüllt und …
    Was soll denn sowas? Was will uns der Autor damit sagen antun?
    Aber um die Frage zu beantworten: Erstelle ein eigenes Event im UC, welches ausgelöst wird, wenn Du auf den Button [Calculate this curve segment] klickst. Das abonnierst Du im MainForm und der entsprechende EventHandler auf dem MainForm führt dann die DGV-Formatierung durch.
    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 schrieb doch, dass das Ganze aus dem Kontext gerissen und absolut zusammengeschrumpft ist. Ich hab's dann noch so hingebogen, dass es irgendwie mein Problem zeigt.
    Der nachfolgende Screenshot zeigt, wie das Projekt eigentlich aussieht. Es ist ein recht umfangreicher Editor der sonst sauber funktioniert.

    Nichtsdestotrotz, vielen Dank. Der Vorschlag mit dem Event hat es gebracht.
    Was ich aber trotzdem nicht ganz verstehe ist:
    Die DataTable aus dem UserControl wird im ParentForm mit einem dortigen DataGridView als DataSource verbunden.
    Warum wird die DataGridView Formatierung gelöscht, wenn sich der Inhalt der DataTable ändert/erneuert wird. Die DataTable wird ja nicht entfernt, nur geleert (.Clear()) und dann neu gefüllt.
    Die Formatierung des DataGridView wird bei dessen Erstellung festgelgt. Somit überrascht es mich, dass eine Änderung der Daten eine Änderung der Formatierung mit sich bringt.
    Du zerhaust Dir das DGV-Aussehen, weil Du auch die DataTable-Spalten löschst und neu anlegst. Ich hatte das testweise mal so gemacht und das klappt erstmal mit der TestApp:

    VB.NET-Quellcode

    1. Private Sub InitDataTableForReturnValuesOfThisCurveSegment()
    2. dt_ReturnValues.Rows.Clear()
    3. If dt_ReturnValues.Columns.Count = 0 Then
    4. dt_ReturnValues.Columns.Add("Nr.", GetType(Integer))
    5. dt_ReturnValues.Columns.Add("Xn", GetType(Double)) 'Xn = Zeitachse
    6. dt_ReturnValues.Columns.Add("Y(A)", GetType(Double)) 'Strom zum Zeitpunkt Xn
    7. dt_ReturnValues.Columns.Add("Y(V)", GetType(Double)) 'Spannung zum Zeitpunkt Xn
    8. End If
    9. '|Nr.| Xn | Y(I) | Y(U) |
    10. '├───┼────┼──────┼──────┤
    11. '| | | | |
    12. End Sub
    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.