2016-05-24 4 views
0

Я пытаюсь использовать TableLayoutPanel в C#, чтобы заполнить Form. TableLayoutPanel shoud hold 10x10 Панели, которые имеют одинаковый размер (по проценту). Хотя мне кажется, что он не работает для последней строки или последнего столбца.Создание ячеек такого же размера с TableLayoutPanel

Мой код до сих пор:

 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); 
      } 
     } 

Результат выглядит следующим образом:

enter image description here

Может быть, вы, ребята, есть обходной путь для этой проблемы.

ответ

1

В Cells 'размеры integers; поэтому для работы макета вам необходимо убедиться, что площадь сети TLP фактически равна делимым количеством ячеек, которое вы хотите, чтобы оно содержалось.

Площадь нетто ClientSize минус Padding.

Так с Padding из вокруг всех сторон вам нужен размер (n * w + 20, m * h + 20) для n x m клеток Width w и Height h.

Так как вы хотите, чтобы заполнить контейнер, необходимы либо:

  • контроля размера контейнера в соответствии с формулой
  • или вычислить Padding так, что она исправляет ошибки целого Divison

Вот функция для вычисления правильного Padding:

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); 
} 

Обратите внимание, что код ..

  • принимает на TLP уже заполнен
  • принимает некоторое значение для минимальнойPadding вы хотите. Так как нам нужно до n-1 пикселей, чтобы сделать коррекцию, горизонтальные и вертикальные прокладки могут отличаться на половина из этого, в вашем случае - до 4 or 5 пикселей.

Вот как вы могли бы назвать его:

allPanel.Padding = GetCorrectionPadding(allPanel, 5); 

Если вы хотите, чтобы избежать этого, нужно идти на первый вариант, то есть убедиться, что контейнер имеет подходящий размер!

Коррекция Padding нужно будет применяться после каждого изменения размера, конечно ..

+0

вау, спасибо много. это сделало трюк – todayihateprogramming

0

Мне не нравится TableLayoutPanel. Я могу достичь того же кода ниже. Количество свойств на TableLayoutPanel ограничено, и я часто нахожу, что мне нужны дополнительные свойства. Вы можете наследовать любой класс (я использовал кнопки). Я размещаю кнопки на форме, но вы также можете поместить кнопки на стандартной панели, чтобы панель можно было перемещать по форме, и все кнопки перемещаются вместе.

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)); 

     } 

    } 
} 
Смежные вопросы