2016-05-24 13 views
0

Ich versuche, die TableLayoutPanel in C# zu verwenden, um ein Form auszufüllen. Die TableLayoutPanel soll 10x10 Panels halten, die alle die gleiche Größe haben (nach Prozent). Obwohl ich nicht scheinen, um es entweder für die letzte Zeile oder die letzten Spalte zu arbeiten.Erstellen von gleicher Größe Zellen mit Table

My-Code so weit:

 allPanel.RowCount = 10; 
     allPanel.ColumnCount = 10; 
     allPanel.Padding = 10; 
     allPanel.BackColor = Color.Green; 
     allPanel.AutoSize = true; 
     allPanel.Dock = DockStyle.Fill; 

     allPanel.RowStyles.Clear(); 
     allPanel.ColumnStyles.Clear(); 

     windowsForm.Controls.Add(allPanel); 

     for (int i = 0; i < 10; i++) { 
      allPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent,10)); 
     } 

     for (int i = 0; i < 10; i++) { 
      allPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10)); 
     } 

     for (int i = 0; i < 10; ++i) { 
      for (int j = 0; j < 10; ++j) { 
       boardTiles[i, j] = new Panel();     
       boardTiles[i, j].BackColor = Color.White; 
       allPanel.Controls.Add(boardTiles[i, j], i, j); 
      } 
     } 

Das Ergebnis sieht wie folgt aus:

enter image description here

Vielleicht haben Sie Jungs eine Abhilfe für dieses Problem.

Antwort

1

Die Cells 'Dimensionen sind integers; so für das Layout arbeiten Sie sicherstellen müssen, dass die Nettofläche der TLP in tatsächlich teilbar durch die Anzahl der Zellen, die Sie wollen, dass es enthalten.

Die Nettofläche ist die ClientSize minus der Padding.

So mit einem Padding von um alle Seiten benötigen Sie eine Größe von (n * w + 20, m * h + 20) für n x m Zellen von Width w und Height h.

Da Sie einen Behälter füllen wollen, müssen Sie entweder:

  • Kontrolle der Behältergröße die Formel
  • oder berechnen Sie die Padding so anzupassen, dass es für die ganze Zahl Divison Fehler korrigiert

Hier ist eine Funktion die richtige Padding zu berechnen:

Padding GetCorrectionPadding(TableLayoutPanel TLP, int minimumPadding) 
{ 
    int minPad = minimumPadding; 
    Rectangle netRect = TLP.ClientRectangle; 
    netRect.Inflate(-minPad, -minPad); 

    int w = netRect.Width/TLP.ColumnCount; 
    int h = netRect.Height/TLP.RowCount; 

    int deltaX = (netRect.Width - w * TLP.ColumnCount)/2; 
    int deltaY = (netRect.Height - h * TLP.RowCount)/2; 

    int OddX = (netRect.Width - w * TLP.ColumnCount) % 2; 
    int OddY = (netRect.Height - h * TLP.RowCount) % 2; 

    return new Padding(minPad + deltaX, minPad + deltaY, 
         minPad + deltaX + OddX, minPad + deltaY + OddY); 
} 
Hinweis

, dass der Code ..

  • das ist die TLP übernimmt bereits gefüllt
  • einen gewissen Wert für diePaddingMinimum annimmt Sie wollen. Da wir zu n-1 Pixel benötigen, um die Korrektur zu tun, die horizontalen und vertikalen Polsterungen kann durch Hälfte kommt, dass in Ihrem Fall um bis zu 4 or 5 Pixel unterscheiden.

Hier ist, wie man es nennen könnte:

allPanel.Padding = GetCorrectionPadding(allPanel, 5); 

Wenn Sie wollen, dass diese Sie für die Option ein, das heißt sicherzustellen, dass der Behälter eine geeignete Größe gehen müssen vermeiden!

Die Korrektur Padding müssen nach jedem Ändern der Größe angewandt wieder werden, natürlich ..

+0

wow, vielen Dank. Das hat den Trick gemacht – todayihateprogramming

0

Ich mag Table nicht. Ich kann dasselbe mit dem folgenden Code erreichen. Die Anzahl der Eigenschaften in einem TableLayoutPanel ist begrenzt und ich finde oft, dass ich zusätzliche Eigenschaften benötige. Du kannst jede Klasse erben (ich habe Knöpfe benutzt). Ich platziere Schaltflächen auf einem Formular, aber Sie können die Schaltflächen auch auf einem Standard-Panel platzieren, sodass das Panel auf einem Formular bewegt werden kann und alle Schaltflächen zusammen verschoben werden.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Buttons 
{ 
    public partial class Form1 : Form 
    { 
     const int ROWS = 5; 
     const int COLS = 10; 
     public Form1() 
     { 
      InitializeComponent(); 
      this.Load += new System.EventHandler(this.Form1_Load); 
     } 
     public void Form1_Load(object sender, EventArgs e) 
     { 
      new MyButton(ROWS, COLS, this); 
     } 


    } 
    public class MyButton : Button 
    { 
     const int WIDTH = 50; 
     const int HEIGHT = 50; 
     const int SPACE = 5; 
     const int BORDER = 20; 

     public static List<List<MyButton>> buttons { get; set; } 
     public static List<MyButton> buttonList { get; set; } 
     public Form1 form1; 
     public int row { get; set; } 
     public int col { get; set; } 
     public MyButton() 
     { 
     } 
     public MyButton(int rows, int cols, Form1 form1) 
     { 
      buttons = new List<List<MyButton>>(); 
      buttonList = new List<MyButton>(); 

      this.form1 = form1; 
      for(int row = 0; row < rows; row++) 
      { 
       List<MyButton> newRow = new List<MyButton>(); 
       buttons.Add(newRow); 
       for (int col = 0; col < cols; col++) 
       { 
        MyButton newButton = new MyButton(); 
        newButton.Height = HEIGHT; 
        newButton.Width = WIDTH; 
        newButton.Top = row * (HEIGHT + SPACE) + BORDER; 
        newButton.Left = col * (WIDTH + SPACE) + BORDER; 
        newButton.row = row; 
        newButton.col = col; 
        newRow.Add(newButton); 
        buttonList.Add(newButton); 
        newButton.Click += new System.EventHandler(Button_Click); 
        form1.Controls.Add(newButton); 
       } 
      } 
     } 
     public void Button_Click(object sender, EventArgs e) 
     { 
      MyButton button = sender as MyButton; 
      MessageBox.Show(string.Format("Pressed Button Row {0} Column {1}", button.row, button.col)); 

     } 

    } 
} 
Verwandte Themen