Benutzer mit den meisten Antworten
Panel.Dock=Left (Unterschiede zur Entwurfzeit und Laufzeit)

Frage
-
Hallo Experten,
ich habe folgende Form mit einem Control Picturebox (Dock=Top) und einem TableLayoutPanel(Dock=Bottom).
füge ich nun der Form noch zur Entwurfzeit eine Panel (Dock=left) bei dann sieht das so aus :
füge ich nun aber mit folgenden Code ein Panel zur Laufzeit hinzu, dann sieht das anders aus ...
Dim xTeamPanel As New List(Of Panel) .... Dim TeamPanel As New Panel () TeamPanel.Name = "TeamPanel" & xTeamPanel.Count.ToString() TeamPanel.Width = 50 TeamPanel.Height = 50 TeamPanel.Top = 100 TeamPanel.Left = 10 + 70 * i TeamPanel.Visible = True TeamPanel.BackColor = Color.Green TeamPanel.BorderStyle = BorderStyle.FixedSingle xTeamPanel.Add(TeamPanel) Me.Controls.Add(TeamPanel) TeamPanel.Dock = DockStyle.Left
Wo liegt da der Fehler , ich hätte gerne das es so ist wie das Panel in/bei der Entwurfzeit
vielen dank für eure Lösungen mfg eem Monarch
Antworten
-
Hallo,
an solchen Dingen haben sich (zu Anfangszeiten von .NET ) schon viele Leute verschluckt.
Wo das Panel landet hängt davon ab, an welcher Stelle der Controls Auflistung es eingefügt wird.Ich hatte Dir deswegen schon bei der vorherigen Frage das TableLayoutPanel angedient,
weil man damit solche Probleme weitgehend vermeiden kann und es mehr Möglichkeiten bietet.
(Lösbar wäre es auch mit Docking Akrobatik gewesen).Beim TableLayoutPanel kannst Du zum einen das Panel bereits zur Entwurfszeit hinzufügen
und über AutoSize und Sichtbarkeit (Visible) das Layout zur Laufzeit anpassen.Alternativ kann man dynamisch weitere Zeilen und Spalten zur Laufzeit hinzufügen.
Ich würde Dir raten, Dich damit näher auseinanderzusetzen.
Mit Dock und Co wird man bei komplexeren Layouts nur in den Wahnsinn getrieben ;-))Gruß Elmar
- Als Antwort markiert Monarch-Falter Montag, 16. Januar 2012 09:16
Alle Antworten
-
Hallo,
an solchen Dingen haben sich (zu Anfangszeiten von .NET ) schon viele Leute verschluckt.
Wo das Panel landet hängt davon ab, an welcher Stelle der Controls Auflistung es eingefügt wird.Ich hatte Dir deswegen schon bei der vorherigen Frage das TableLayoutPanel angedient,
weil man damit solche Probleme weitgehend vermeiden kann und es mehr Möglichkeiten bietet.
(Lösbar wäre es auch mit Docking Akrobatik gewesen).Beim TableLayoutPanel kannst Du zum einen das Panel bereits zur Entwurfszeit hinzufügen
und über AutoSize und Sichtbarkeit (Visible) das Layout zur Laufzeit anpassen.Alternativ kann man dynamisch weitere Zeilen und Spalten zur Laufzeit hinzufügen.
Ich würde Dir raten, Dich damit näher auseinanderzusetzen.
Mit Dock und Co wird man bei komplexeren Layouts nur in den Wahnsinn getrieben ;-))Gruß Elmar
- Als Antwort markiert Monarch-Falter Montag, 16. Januar 2012 09:16
-
Hallo Elmar,
wie immer bist du ein Licht in der Dunkelheit des VB's. Wie du oben feststellst, habe ich deinen Rat auch angenommen und (siehe Bild oben) als Bottom-Control das TableLayout verwendet, Dies klappte sehr gut, das es komplett zur Entwurfzeit definiert worden ist. Als ich dann ein zweites TableLayout (anstatt des Panels) in "Mitte" der Form einfügte war alles noch gut ... aber änderungen zur Laufzeit, wie das hinzufügen von Spalten oder auch Reihen mit entsprechenden Einstellungen etc wollte nicht funzen. Zum Beispiel haben ich zur Entwurfzeit eine Tablelayout mit 2 Spalten (Breite auf 50%) erstellt, zur Laufzeit wollte ich dann eine 3 Spalte hinzufügen und alle Spalten auf 33% setzen.
TableLayoutPanel1.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 33))
Das klappte nicht, auch Nachforschungen im Web brachten mich nicht weiter .... Wenn du mir sagen kannst wie , wäre das nett ...
:-) mfg eem monarch
PS: Wie du auch feststellst habe ich ebenso deinen Rat in Bezug auf List(ofT) befolgt ....
- Bearbeitet Monarch-Falter Sonntag, 15. Januar 2012 11:17
-
Es liegt an der Reihenfolge.
Der Designer fügt die Panels in umgekehrter Reihenfolge wie sie erstellt wurden dem Formular hinzu.
Folgende Vorgehensweise funktioniert aber auch zur Laufzeit.
Dim p As New Panel p.BackColor = Color.Green p.Location = New System.Drawing.Point(0, Me.Panel1.Height) p.Size = New System.Drawing.Size(Me.ClientSize.Height - Me.Panel2.Height - Me.Panel1.Height, 224) p.Anchor = CType(AnchorStyles.Left + AnchorStyles.Bottom + AnchorStyles.Top, AnchorStyles) Me.Controls.Add(p)
-
Hallo,
es ist schwer dort eine allgemeine Empfehlung zu geben, denn es gibt je nach beabsichtigten Zweck diverse Ansätze.
Zu den Größenangaben ist zu sagen: Sie sind nicht wirklich absolut anzusehen.
Wenn Du zwei Spalten mit 50 % eine mit 33 % hinzufügst, so käme dabei 133 % heraus,
was wiederum umgerechnet würde in 50 / 1,33 => ~ 37,5 % und 33 / 1,33 => ~ 25 %.Willst Du dynamisch weitere Panels in einer Ebene (horizontal oder vertikal) hinzufügen,
kann das FlowLayoutPanel eine bessere Wahl sein.Beim Änderungen des Aufbaus sollte man über SuspendLayout / ResumeLayout arbeiten,
damit Berechnungen durch die LayoutEngine erst erfolgen, wenn man mit dem Zusammenbau fertig ist.Im Extremfall kann man auch eine eigene LayoutEngine basteln:
Gewusst wie: Implementieren eines benutzerdefinierten Layoutmoduls
(was ich nie versucht habe und wozu man das Verhalten der Elemente gut kennen sollte).Gruß Elmar
-
Hallo Elmar,
ich habe jetzt folgendes festgestellt, wenn man ein FlowLayoutPanel zur Entwurfzeit hinzufügt und diese dann zur Laufzeit mit
TableLayoutPanel1.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 33))
anpassen will, funzt das nicht richtig. Wenn ich aber das ganze FlowLayoutPanel zur Laufzeit erstelle, funzt das super (warum keine Ahnung). Jetzt hätte ich nur noch eine Kleinigkeit, wo du mir vielleicht doch noch einen Tipp geben kannst. Wenn ich ein Label innerhalb einer Zelle eine FlowLayoutPanel habe und die Form hochziehe, gibt es dann eine Möglichkeit die Fontgröße des Labels autom. entsprechend ebenfalls zu vergrößern.
mfg eem monarch
-
Hallo,
meinst Du jetzt Flow- oder TableLayoutPanel?
(Und nicht, das Du etwas zu lange ohne Pause davor gesessen hast ;-)Die Layout Panel passen nur die Größe an, andere Eigenschaften werden nicht verändert.
Da müsstet Du auf das Resize Ereignis des Labels (oder anderer Elemente) reagieren.Gruß Elmar
-
Servus Elmar,
ja viel zu lange an Dock & Co gebastelt und jetzt dem Waaaaaahsinn nahe. Also, habe jetzt versucht alle Controls zur Laufzeit zu erstellen und mit den Eigenschaften Dock & Co rumgebastelt. Das Resultat das ist alles Banane oder nicht zu ende gedacht. Jetzt habe ich mit folgender Lösung angefangen. Ich erstelle die Container ( Panel, TableLayout etc) zur Entwurfzeit und beim Load werden dies alle abgefragt und in einer Strukturvariable (Stichwort: Vektor) die Wert abgelegt. Ändert sich der "Vektor" der Form werden die Controls über Verktorberechnung neu berechnet. Das funzt im ersten Ansatz ganz gut ... aber warten wir mal ab...
mfg eem Monarch (ich muss auf das Sofa von Doc sonst werde ich verrückt)