Split Container and DataGrid View - Shift Splitter

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Split Container and DataGrid View - Shift Splitter

    Hi,

    ok ok, wieder mal SplitContainer und DatagridView problems, Ich hoffe, ich gehe euch nicht zu sehr auf die Nerven !

    Inzwischen habe ich die Sache mit dem dynamischen Ein- und Ausblenden der Spalten der Datagrid View dank eurer Denkanstöße hinbekommen. Das läuft alles sehr zufriedenstellend! Ich bin richtig happy.

    Leider läuft aber eine Funktionalität NICHT:

    Wenn ich den Splitter verschiebe, vergrößert sich das linke Panel1, während sich das rechte Panel2 entsprechend verkleinert und umgekehrt. So ist das ja auch vorgesehen.

    Das möchte ich ändern. Wenn ich den Splitter nach rechts verschiebe und damit das linke Panel1 vergrößert wird, dann soll sich auch die Form um den gleichen Betrag vergrößern, damit das rechte Panel2 die Größe beibehält. Und Gleiches soll sinngemäß gelten, wenn man den Splitter nach links verschiebt. Die Größe des rechten Panels des SplitContainers soll also erhalten bleiben, wenn man den Splitter verschiebt.

    Das Verändern der Fenstergröße ist normalerweise kein Problem. Wenn man das aber im Zusammenhang mit dem Verschieben des Splitters macht, tritt ein merkwürdiger Effekt auf:

    VB.NET-Quellcode

    1. Private Sub SplitContainer1_SplitterMoved(sender As Object, e As SplitterEventArgs) Handles SplitContainer1.SplitterMoved
    2. 'Adjust width of form according to shift of splitter
    3. Dim currentFormSize As Size = Me.Size 'Get current form size
    4. Dim ShiftSplitter As Integer = SplitContainer1.SplitterDistance - HoldSplitterDistance
    5. HoldSplitterDistance = SplitContainer1.SplitterDistance 'Remember new splitter position
    6. currentFormSize.Width += ShiftSplitter 'Adjust form size according to shift of splitter
    7. Me.Size = currentFormSize
    8. End Sub


    Anhang 1 zeigt die Ausgangssituation.

    Anhang 2 zeigt die Situation nach dem Verschieben des Splitters. Die Form vergrößert sich ... aber die DatagridView wird nicht "mitgenommen". Und genau das ist mein PROBLEM !

    Wenn man nun die Form geringfügig verkleinert oder vergrößert, wird dieser Fehler merkwürdigerweise "automatisch korrigiert". Dies zeigt Anhang 3.

    Hat jemand eine Ahnung woran das liegt ? Und wie man das gegebenenfalls beheben kann ?

    Ich hab mein Testproject zum Ausprobieren angehängt.

    LG
    Peter
    Bilder
    • s 2017-05-04 14-54-065.jpg

      52,8 kB, 937×494, 233 mal angesehen
    • s 2017-05-04 14-54-276.jpg

      65,6 kB, 1.395×494, 158 mal angesehen
    • s 2017-05-04 14-54-408.jpg

      71,92 kB, 1.395×494, 159 mal angesehen
    Dateien
    @Peter329 Vielleicht initialisierst Du die Variable HoldSplitterDistance im Form_Load, dann scheint es initial ruhiger zu laufen.
    Das unterschiedliche Verhalten bei Rechts-Links ist merkwürden.

    VB.NET-Quellcode

    1. HoldSplitterDistance = SplitContainer1.SplitterDistance 'Remember new splitter position
    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!
    Jau, die Initialisierung der Variablen HoldSplitterDistance fehlt in der Load Prozedur. Die hab ich beim Aufbereiten des TestProjects verschlabbert.

    Aber das löst nicht das Problem.

    Sowohl beim Verschieben des Splitters nach rechts, wie auch nach links ist die Darstellung der DatagridView nach dem Vergrößern bzw. Verkleinern von Me.Size.Width nicht richtig.

    Wenn man nach rechts verschiebt und genau hinsieht, dann erkennt man dass der Rahmen der GroupBox überlagert wird ! Warum auch immer.

    Was das .NET da treibt, verstehe ich nicht.
    @Peter329 Jou.
    Ich hab eben noch mal mit Me.Width +-1 getestet, auch nix.
    Man müsste sich in der WndProc mal ausgeben, was da an Resize-Aktionen für die einzelnen Objekte ankommt, dann wäre da vielleicht was zu verstehen.Du hast da ja eine ganze Menge Kleinholz verbaut, so dass da nicht nachzukommen ist.
    Vielleicht so was:
    Alle Anchors, Docks usw. rausnehmen und beim Splitter-ziehen und beim Form-ziehen alle Breiten selbst ausrechnen und setzen.
    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!
    Draggen mit Resizen/Moven von Controls ist heikel.
    Wenn sich das gedraggte Control unter der Maus bewegt. löst das ein weiteres MouseMove aus, was wieder als Drag-Bewegung interpretiert werden kann - Stichwort Ereigniskette.
    K.A., ob das bei dir zutrifft, aber wenn - nicht wundern, wenn sich was komisch verhält.

    Überprüfe mal, ob a. SplitContainer FixedPanel.Panel1 eingestellt ist. Wenn nicht, dann kriegst du nämlich die genannte Ereigniskette.

    Anderes Frage, ob das gute Idee ist, das Form per Code zu vergrößern. Da haste dann ja schnell einen Teil des Forms aussm Monitor geschoben - oder was passiert, wenn der User das Fenster maximiert hat?
    Also, wenn der SplitContainer Links und Rechts gedockt ist, vergrößert er sich, sobald die Form verbreitert/verschmälert wird, automatisch. Der Splitter in der Mitte beeinflusst üblicherweise nicht die breite der Form. Kann man sicher irgendwie machen, aber sobald man die eigentliche (vom user gewohnte) Funktionalität umbaut, könnte die usability leiden.

    Als Tipp: Mit WinForms lässt sich viel erreichen, wenn man mit GroupBoxen und dem Docken arbeitet. Ist halt Fummelarbeit ;)
    "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
    Ok, erst mal recht herzlichen Dank für eure Beiträge.

    ich habe jetzt meine "Experimente" abgeschlossen ... und das sind die Ergebnisse, die ich daraus ableite:

    1. Wenn man EIN Control dynamisch ändert, dann geht das meist gut. Man muss allerdings zwei Dinge im Auge behalten:

    - machmal muss man verhindern, dass bestimmte Änderungen bereits während der Initialisierung zuschlagen. Das kann man mit einem FLAG erreichen ... oder eben, indem man verhindert, dass solche Ereignisse ausgelöst werden, indem man im Designer bestimmte Eigenschaften NICHT setzt.

    - manche Änderungen kollidiern mit bestimmten Eigenschaften. Das Verändern der Splitter Distance kollidiert mit der Minimum Size Eigenschaft des zweiten Splitter Panels. Deshalb darf man in so einem Fall die MinimumWidth Eigenschaft dieses Panels NICHT setzen.

    2. Änderungen von ZWEI (oder mehr) Eigenschaften von Controlls sind prinzipiell KRITISCH. Das "Räderwerk" des .NET ist dafür in manchen Fällen einfach nicht ausgelegt. Versucht mal z.B. die Splitter Distance und die Form Width in der gleichen Prozedur zu verändern, dann kommt es zu sehr unangenehmen Effekten, die wohl einfach darauf zurückzuführen sind, dass die Reihenfolge von gewissen Operationen nicht mehr richtig ist. Versucht man das "von Hand" zu korrieren (etwa durch "eigenständiges Setzen" bestimmter Eigenschaften, wie DataGridView.Size.Width oder Form.MinimumWidth), dann hilft das nicht unbedingt, weil man andere Abhängigkeiten verletzt ! Man treibt den "Teufel" mit dem "Belzebub" aus und schafft eher mehr Probleme als man behebt.

    Ich denke, zufriedenstellend ließe sich das letzten Endes nur mit "handgefertigten" Controls lösen. Aber ob man sich das antun sollte? Ich für meinen Teil verzichte da lieber drauf.

    Und dies ist nun auch die Lösung für mein Problem. Ich verkneife mir einfach das Anpassen der Form.Size.Width ... und überlasse das dem geneigten Anwender. Das überleben die Leute ...man kann eben im Leben nicht alles haben. Und schließlich klappt alles andere (wie das Ein- und Ausblenden der Spalten, sowie das manuelle Setzen des Splitters oder der Form Size) ja hervorragend !

    Danke für eure Ratschläge, die mich immerhin darin bestätigt haben, dass meine Ansichten dann nicht gar so unbegründet sind.

    Vielleicht lassen sich die "Koryphäen" jetzt ja mal ausnahmensweise zu einem huldvollen "hilfreich" herab. Das war nämlich ganz schön viel Arbeit ... und schließlich gebe ich euch ja auch meist ein "hilfreich" für wesentlich weniger Aufwand! (nicht so ganz ernst gemeint .... :) )

    Have a nice weekend
    LG
    Peter