TableLayoutPanel - GrowStyle AddColums
-
Moin moin,
Ich möchte folgendes erreichen:
Zur Laufzeit wird eine variable Anzahl an checkBox Controls erstellt. Diese möchte ich nun in einem UserControl vernünftig anordnen, was mir leider nicht gelingt.
//längste Antwort finden um checkButton Size einzustellen String längsteAntwort = ""; foreach (String antwort in antworten) if (antwort.Length > längsteAntwort.Length) längsteAntwort = antwort; cButton = new CheckBox(); cButton.Text = längsteAntwort; cButton.AutoSize = true; cButton.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); Graphics g = cButton.CreateGraphics(); //Für Multiple Choice - neues Layout foreach (String antwort in antworten) { cButton = new CheckBox(); cButton.Appearance = Appearance.Button; cButton.AutoSize = false; cButton.TextAlign = ContentAlignment.MiddleCenter; cButton.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); cButton.Size = new Size ((g.MeasureString(längsteAntwort, cButton.Font).ToSize ()).Width + 10, cButton.Size.Height * 2); //cButton.Text = antworten[flowPanel.Controls.Count]; cButton.Text = antworten[t.Controls.Count]; //flowPanel.Controls.Add(cButton); t.Controls.Add(cButton); }
TableLayout Panel
//Debug TableLayoutPanel t = new TableLayoutPanel(); t.Size = new Size((g.MeasureString(längsteAntwort, cButton.Font).ToSize()).Width + 20, this.Size.Height); t.Location = new Point( ((this.Size.Width - t.Size.Width) / 2), 0); t.CellBorderStyle = TableLayoutPanelCellBorderStyle.None; t.GrowStyle = TableLayoutPanelGrowStyle.AddColumns; t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; t.AutoSize = true; this.Controls.Add(t);
Möglicherweise ist mein Weg etwas umständlich. Ich ermittle den längsten übergebenen String und passe alle zur Laufzeit erstellten checkBox Control an diese Größe an, einfach um ein einheitliches Bild zu erreichen.
Ebenso das LayoutPanel. Anfangs zentriere ich dieses auf dem UserControl, damit alle Antworten untereinander stehen. Gibt es nun aber mehr Antworten als untereinander in die Liste passen, möchte ich das LayoutPanel um eine Spalte erweitern, und die übrigen Controls dort einfügen.
Leider funktioniert hier GrowStyle nicht wie gedacht. Was mache ich falsch ?
-
Hallo,
ich nehme an, bei dir sind ColumnCount und RowCount jeweils noch auf dem Standardwert von 0. Setze einfach mal RowCount auf die maximale Zeilenanzahl (z.B. 6).
-
Ja, auf den ersten Blick scheint das zu funktionieren. Gibt es auch eine Möglichkeit abzufragen, ob eine neue Zeile eröffnet wurde ? Finde dafür nichts passendes.
Ausserdem treten nun zwei neue Probleme auf:
1. TableLayoutPanel macht Probleme beim zentrieren
http://img9.imageshack.us/i/problem3s.jpg/2. Controls werden abgeschnitten
http://img26.imageshack.us/i/problem2uk.jpg/Wenn noch einer Lust hat, werft mal einen Blick drauf:
//Debug TableLayoutPanel t = new TableLayoutPanel(); //t.Size = new Size((g.MeasureString(längsteAntwort, cButton.Font).ToSize()).Width + 10, this.Size.Height); t.Size = new Size(cButton.Size.Width + 5, this.Size.Height); t.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; t.GrowStyle = TableLayoutPanelGrowStyle.AddColumns; t.RowCount = 6; t.ColumnCount = 3; t.AutoSize = true; //Für Multiple Choice - neues Layout foreach (String antwort in antworten) { cButton = new CheckBox(); cButton.Appearance = Appearance.Button; cButton.AutoSize = false; cButton.TextAlign = ContentAlignment.MiddleCenter; cButton.Font = new System.Drawing.Font("Verdana", 8.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); cButton.Size = new Size ((g.MeasureString(längsteAntwort, cButton.Font).ToSize ()).Width + 10, cButton.Size.Height * 2); cButton.Text = antworten[t.Controls.Count]; t.Controls.Add(cButton); } IQuizPanel.IHauptprogramm.status.Text = "Colums: " + t.ColumnCount + " --- Rows: " + t.RowCount; t.Location = new Point(((this.Size.Width - t.Size.Width) / 2), 0); this.Controls.Add(t);
-
hallo,
lass mal den ColumnCount weg und setze die Size von dem
TableLayoutPanel nicht!