row Größe ändern wärend der Laufzeit vom tablelayoutpanel

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Icemo.

    row Größe ändern wärend der Laufzeit vom tablelayoutpanel

    Hallo,

    hab noch nen kleines Problem den rest denke bekomm ich dann hin.

    Erst mal habe ich es mit den Bildlaufleisten vorerst hinbekommen.
    Aber da ich ein tlp = tablelayoutpanel nutze habe ich da ne kleine Frage zu.
    Ich möchte je nach sichtbarkeit von Elementen die Zeilenhöhe einzelner Rows ändern zur Laufzeit.

    Habe den Befehl " tlpWochenansicht.RowStyles(5).Height = 164" benutzt, aber leider passiert garnichts.
    Das er die Zeile abbarbeitet ist sichergestellt. Ist hier noch ein kleiner Klammer oder Punktfehler drin?

    Habe schon vieles ausprobiert nur bis jetzt ohne Erfolg.
    Glaub du hast mich leicht missverstanden.
    Im datagridview ist klar da sind die rows Schriftgrösse gebunden bzw alle gleich hoch.
    Ich aber meinte das Tablelayoutpanel.
    Da gibt es auch Zweilen und spalten.
    Da ich in bestimmten spalten einige elemente auf visible d= false setze und in diesem falle gerne die Zeile verkleinern würde,
    Wäre es eben schön wenn ich die Zeilenhöhe direkt ändern könnte. Dann werden zwar einige elemente ausserhalb der Zeile sein, was aber egal ist da sie eh nicht sichtbar sind.
    Aber ich werde drotzdem mal in den link schauen evtl gibt dies mir die lösung.
    und ob ich mich vertan habe.
    es gibt bei msdn zwei Beispiele, die habe ich dir mal zusammen in ein TabelLayoutPanel gepackt.
    Damit kannst du die Spaltenbreite und die Zeilenhöhe verändern.
    Mach mal Form1, TabelLayoutPanel1 und zwei Button:

    Und dann Packst du diesen Code da rain:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim styles As TableLayoutColumnStyleCollection = Me.TableLayoutPanel1.ColumnStyles
    4. For Each style As ColumnStyle In styles
    5. If style.SizeType = SizeType.Absolute Then
    6. style.SizeType = SizeType.AutoSize
    7. ElseIf style.SizeType = SizeType.AutoSize Then
    8. style.SizeType = SizeType.Percent
    9. ' Set the column width to be a percentage
    10. ' of the TableLayoutPanel control's width.
    11. style.Width = 33
    12. Else
    13. ' Set the column width to 50 pixels.
    14. style.SizeType = SizeType.Absolute
    15. style.Width = 50
    16. End If
    17. Next
    18. End Sub
    19. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    20. Dim styles As TableLayoutRowStyleCollection = Me.TableLayoutPanel1.RowStyles
    21. For Each style As RowStyle In styles
    22. If style.SizeType = SizeType.Absolute Then
    23. style.SizeType = SizeType.AutoSize
    24. ElseIf style.SizeType = SizeType.AutoSize Then
    25. style.SizeType = SizeType.Percent
    26. ' Set the row height to be a percentage
    27. ' of the TableLayoutPanel control's height.
    28. style.Height = 33
    29. Else
    30. ' Set the row height to 50 pixels.
    31. style.SizeType = SizeType.Absolute
    32. style.Height = 50
    33. End If
    34. Next
    35. End Sub
    36. End Class


    Nun müsstest du einen ansatz haben wie du an die Row und Colum Werte ran kommst.

    msdn: Rows
    msdn: Colums

    So und wenn ich mich jetzt wieder vertan habe, darfst du schimpfen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ChaosBernd“ ()

    Ok, das hört sich richtig an, habe es zwar noch nicht getestet, aber wenn ich den Code mal so überlesen habe
    weis ich wo der Ansatz bei mir falsch ist.
    Ne kleine Frage habe ich noch dazu, die If Schleife für Absolut und percent etc, die kann ich doch auch weglassen oder?
    Weil ich ja im vorraus weis ob sie Absolut sind, zu mindest in meinem Fall.
    Und um eine Bestimmte Zeile zu ändern geh ich von aus das ich dann nur bei

    Dim styles As TableLayoutRowStyleCollection = Me.TableLayoutPanel1.RowStyles hir am ende in Klammern gesezt den Zeilenindex setzen muss. Werde ich zur Not halt testen.

    Aber danke für den Ansatz.

    ChaosBernd schrieb:

    ' Set the row height to 50 pixels.
    style.SizeType = SizeType.Absolute
    style.Height = 50
    End If

    Wenn du das erstemal auf einen Button klickst dann setzt er nach %. beim zweitenmal klicken (siehe ausschnitt) setzt er zurück auf die alte größe.
    Das Beispiel ist sehr schön. schau es dir an und propbier aus. es wird schon gehen.
    Ok soweit so gut verstehe den code schnipsel auch, nun bin ich zwar schon recht nahe, drotzdem fehlt mir noch ne kleine info die ich irgendwie nicht hinbekomme.

    Wie greife ich auf eine Bestimmte Zeile zu? mit deiner variante greife ich ja auf alle Zeilen/Spalten zu ist ja auch nicht schlecht.

    Ich könnte es mit einer Caseanweisung lösen, indem ich abfrage bei welcher row er gerade ist. nur denke ist nicht die schöne art.

    Zumal ich ja pro Spalte/Zeile ein control abfrage (welche unterschiedliche namen haben) ob es sichtbar ist oder nicht.

    Dann wäre es natürlich besser wenn mann direkt auf eine spalte/zeile zu greifen kann.
    werde ich machen sobald ich auch eine laufzeitfreundliche lösung besitze.
    Weil denke es macht sinn gleich saubere codes zu nutzen und sich sowas anzueignen, auch wenn es manchmal schwerfällig und mühselig ist.
    Ich spreche da aus erfahrung.
    So hier meine Lösung, ist basierend auf Rowstyle = Absolute

    VB.NET-Quellcode

    1. Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. Dim styles As TableLayoutRowStyleCollection = Me.TableLayoutPanel1.RowStyles
    3. Dim Wert As Int16 ' Eingabewert für die Zeilenhöhe
    4. Dim Zeile As Byte ' Eingabewert welche Zeile bearbeitet wird
    5. Dim Zähler As Byte = TableLayoutPanel1.RowCount ' Zähler, um festzustellen in welcher Zeile er sich befindet
    6. ' Eingaben der Höhenwerte und Zeilenposition über Inpuboxen
    7. Wert = InputBox("Wert eingeben!")
    8. zeile = InputBox("Zeile eingeben!")
    9. For Each style As RowStyle In styles
    10. Zähler -= 1
    11. If Zeile = TableLayoutPanel1.RowCount - Zähler Then
    12. style.SizeType = SizeType.Absolute ' Nicht getestet aber glaube diese Position kann man weglassen, wenn die Zeile eh auf Absolut steht
    13. If Wert < TableLayoutPanel1.RowStyles.Item(TableLayoutPanel1.RowCount - Zähler - 1).Height Then Vergleich ob Neue Höhenangabe kleiner ist wie die Alte
    14. TableLayoutPanel1.Height -= Wert ' Wenn ja, wird das ganze Tablelayoutpanel um den wert verkleinert
    15. ElseIf Wert > TableLayoutPanel1.RowStyles.Item(TableLayoutPanel1.RowCount - Zähler - 1).Height Then ' Überprüfen ob der neue Wert größer ist als der Alte
    16. TableLayoutPanel1.Height += Wert - TableLayoutPanel1.RowStyles.Item(TableLayoutPanel1.RowCount - Zähler - 1).Height ' Wenn ja wird das Layoutpanel um diesen Wert vergrössert
    17. Else
    18. End If
    19. style.Height = Wert ' Stellt die eigentliche Zeilenhöhe ein
    20. End If
    21. Next
    22. End Sub


    Dieser Code ist noch mit kleinen Fehler beinhaltet, möchte den Copy-Paste Effect vermeiden.
    Aber im ganzen functioniert dies so.

    Einziger Nachteil hierbei ist, das er auch bei xxx-Zeilen jede zeile durchläuft und nachschaut ob er sie bearbeiten soll.
    Wenn da noch jemand einen Tip zu hat wie ich dieses verbessern kann Danke ich für.

    Hab das ganze noch mal überarbeitet und für Spalten und Zeilen erstellt.
    Wer interesse hat kann ja reinschauen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub btnSpaltenbreite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSpaltenbreite.Click
    2. Dim styles As TableLayoutColumnStyleCollection = Me.TableLayoutPanel1.ColumnStyles
    3. Dim Gesamtgroesse, Altgroesse, Neugroesse As Integer
    4. Dim Spalte As Byte
    5. Dim Zähler As Byte = TableLayoutPanel1.ColumnCount
    6. Spalte = InputBox("Spalte eingeben!")
    7. Gesamtgroesse = TableLayoutPanel1.Width
    8. Altgroesse = TableLayoutPanel1.ColumnStyles.Item(Spalte - 1).Width
    9. Neugroesse = InputBox("Spalte eingeben!")
    10. For Each style As ColumnStyle In styles
    11. Zähler -= 1
    12. If Spalte = TableLayoutPanel1.ColumnCount - Zähler Then
    13. style.SizeType = SizeType.Absolute
    14. style.Width = Neugroesse
    15. TableLayoutPanel1.Width = HoeheRechnen(Gesamtgroesse, Altgroesse, Neugroesse)
    16. End If
    17. Next
    18. End Sub
    19. Private Sub btnZeilenhoehe_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZeilenhoehe.Click
    20. Dim styles As TableLayoutRowStyleCollection = Me.TableLayoutPanel1.RowStyles
    21. Dim Gesamtgroesse, Altgroesse, Neugroesse As Integer
    22. Dim Zeile As Byte
    23. Dim Zähler As Byte = TableLayoutPanel1.RowCount
    24. Zeile = InputBox("Zeile eingeben!")
    25. Gesamtgroesse = TableLayoutPanel1.Height
    26. Altgroesse = TableLayoutPanel1.RowStyles.Item(Zeile - 1).Height
    27. Neugroesse = InputBox("Wert eingeben!")
    28. For Each style As RowStyle In styles
    29. Zähler -= 1
    30. If Zeile = TableLayoutPanel1.RowCount - Zähler Then
    31. style.SizeType = SizeType.Absolute
    32. style.Height = Neugroesse
    33. TableLayoutPanel1.Height = HoeheRechnen(Gesamtgroesse, Altgroesse, Neugroesse)
    34. End If
    35. Next
    36. End Sub
    37. Public Function HoeheRechnen(ByVal Gesamtgroesse As Integer, ByVal Altgroesse As Integer, ByVal Neugroesse As Integer) As Integer
    38. If Neugroesse < Altgroesse Then
    39. HoeheRechnen = Gesamtgroesse - (Altgroesse - Neugroesse)
    40. ElseIf Neugroesse > Altgroesse Then
    41. HoeheRechnen = Gesamtgroesse + (Neugroesse - Altgroesse)
    42. Else : End If
    43. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Icemo“ ()