TableLayoutPanel

from https://dobon.net/vb/dotnet/control/tlbeginning.html#span


TableLayoutPanelコントロールを使って、コントロールを表形式で整列させる

注意:TableLayoutPanelコントロールは.NET Framework 2.0以降でのみ使用できます。

TableLayoutPanelコントロールとは?

TableLayoutPanelコントロールは、まるでHTMLのTABLEタグのようなコントロールと言えば分かりやすいでしょうか。複数のコントロールを表形式で整列させることができます。特に、並べたコントロールのサイズや、表示、非表示を変更してもそれに合わせて自動的に整列させたい場合に使用すると便利です(コントロールを縦、あるいは横方向に並べたい場合は、FlowLayoutPanelコントロールが適しています)。
例えば下の画像はMSDNの「方法 : データ入力用のサイズ変更可能な Windows フォームを作成する」で紹介されている使用例ですが、「First Name」や「Address」などの項目名を日本語にしてLabelコントロールの長さが変わってしまったとしても、コントロールはきれいに自動で整列します。このように、ローカリゼーションによってコントロールの大きさが変わっても対応できます。
TableLayoutPanelコントロールを使った例

Visual Studioのフォームデザイナによる簡単な使い方

使い方は簡単で、フォームにTableLayoutPanelコントロールを配置して、セルにコントロールを配置するだけです。1つのセルには1つのコントロールしか置けません。セルにPanelコントロールを配置し、そこに複数のコントロールを配置することはできます。
コードでコントロールを追加する方法は、「TableLayoutPanelに動的にコントロールを追加する」で説明します。

列数、行数を変更する

テーブルの列の数は、TableLayoutPanel.ColumnCountプロパティで変更できます。行の数は、TableLayoutPanel.RowCountプロパティです。
指定した位置に列や行を挿入したり、削除するには、フォームデザイナのTableLayoutPanel上で右クリックして、コンテキストメニューを表示させます。メニューに「列」や「行」の項目があり、その下に「追加」「挿入」「削除」があります。「挿入」は、右クリックした位置の前に挿入します。「追加」は、最終列、最終行に追加します。
TableLayoutPanelのコンテキストメニュー
または、フォームデザイナでTableLayoutPanelを選択した時にプロパティウィンドウの下に表示される「列の追加」「行の追加」「最終列の削除」「最終行の削除」をクリックして変更することもできます。
さらには、プロパティウィンドウのColumnsプロパティやRowsプロパティを変更しようとすると表示される「列と行のスタイル」ダイアログを使って変更することもできます。このダイアログは、プロパティウィンドウの下に表示される「行および列の編集...」をクリックしても表示できます。
「列と行のスタイル」ダイアログ

列、行の幅を変更する

フォームデザイナでセルの境界線をドラッグ&ドロップで移動させることができます。ただ、大雑把にしか指定できません。
上で紹介したTableLayoutPanelのコンテキストメニューや、「列と行のスタイル」ダイアログを使うと、詳細に列と行の幅を変更することができます。
コードで変更する方法は、「TableLayoutPanelの行や列の幅を変更する」で説明します。

セルを拡張する

あるセルを横に拡張する(あるセルにあるコントロールが隣のセルにまたがるようにする)には、そのセルにあるコントロールのColumnSpanプロパティを2にします。同様に下に拡張する(下のセルにまたがるようにする)には、コントロールのRowSpanプロパティを2にします。
ただしこれらのプロパティは、Visual Studioのフォームデザイナを使った時しか使用できません。コードで行う方法は、「TableLayoutPanelのセルの行や列を拡大する」で説明します。

セル内のコントロールの配置方法を変更する

セル内のコントロールは、AnchorプロパティまたはDockプロパティによって配置方法を指定することができます。通常のAnchorとDockプロパティは、親コントロール全体の領域に対してコントロールをどのように固定するかを示していますが、TableLayoutPanelの子コントロールのAnchorとDockプロパティは、セルの領域の上下左右(あるいは真ん中)のどこに配置するかを示します。
AnchorプロパティとDockプロパティによってコントロールがどのように配置されるかを以下の画像でご確認ください。
TableLayoutPanelの子コントロールのAnchorとDockプロパティ
また、後ほど紹介するサンプル「TableLayoutPanel1.exe」を使ってもご確認いただけます。

TableLayoutPanelを使用する際のガイドライン

MSDNの「TableLayoutPanel コントロールの推奨される手順」では、TableLayoutPanelコントロールをどのようなケースで使用し、どのようなケースでは使用すべきではないかが説明されています。
これによると、親フォームのサイズ変更や、ローカリゼーションに伴いコントロールに表示するテキストの長さが変更されるようなケースでTableLayoutPanelコントロールを使うのが有効であるということです。
逆に推奨されない、避けるべきとされているのは、TableLayoutPanelコントロールのDockプロパティをFillにする、TableLayoutPanelに別のTableLayoutPanelを配置して入れ子にする、TableLayoutPanelを配置したフォームを継承したフォームでさらにコントロールを追加する、列がレベルとテキストの2つしかない単純なフォームで使用するなどです。
補足:MSDN内の説明やサンプルにもこれらの推奨事項に反するものが見られます。例えば、「TableLayoutPanel クラス」にあるTableLayoutPanelの説明に「任意の Windows フォーム コントロールを TableLayoutPanel コントロールの子にできます。これは、 TableLayoutPanel の他のインスタンスを含みます。 これにより、実行時の変更に合わせた高度なレイアウトを構築できます。」とありますが、TableLayoutPanelを入れ子にしないという「TableLayoutPanel コントロールの推奨される手順」の記述と矛盾しています。

サンプル

TableLayoutPanelコントロールの実際の挙動を確かめるためのサンプル(TableLayoutPanel1.exe)を用意しました。
TableLayoutPanelコントロール







from http://blog.csdn.net/taoerit https://blog.csdn.net/taoerit/article/details/55252155

 案例需求:利用TableLayoutPanel动态添加一行,和删除一行


  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using DSkin.Controls;
  10. namespace TestForm
  11. {
  12. public partial class Form2 : Form
  13. {
  14. public Form2()
  15. {
  16. InitializeComponent();
  17. }
  18. TableLayoutPanel table = new TableLayoutPanel();
  19. private void Form2_Load(object sender, EventArgs e)
  20. {
  21. // 默认添加一行数据
  22. table.Dock = DockStyle.Top;
  23. panel2.Controls.Add(table);
  24. // table.RowCount++;
  25. table.ColumnCount = 4;
  26. table.Height = table.RowCount * 40;
  27. int step = 100 / table.ColumnCount;
  28. table.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, step));
  29. table.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, step));
  30. table.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, step));
  31. table.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, step));
  32. for (int ii = 0; ii < table.RowCount; ii++)
  33. {
  34. table.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40));
  35. }
  36. }
  37. /// <summary>
  38. /// 添加一行
  39. /// </summary>
  40. /// <param name="sender"></param>
  41. /// <param name="e"></param>
  42. private void button1_Click(object sender, EventArgs e)
  43. {
  44. // 动态添加一行
  45. table.RowCount++;
  46. //设置高度
  47. table.Height = table.RowCount * 40;
  48. // 行高
  49. table.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40));
  50. // 设置cell样式,
  51. table.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
  52. int i = table.RowCount - 1;
  53. // 添加控件
  54. CheckBox p = new CheckBox();
  55. p.Anchor = AnchorStyles.None;
  56. p.TextAlign = ContentAlignment.MiddleCenter;
  57. table.Controls.Add(p, 0, table.RowCount-1);
  58. p.Text = "" + i; ;
  59. TextBox name = new TextBox();
  60. name.Text = "name-"+i;
  61. name.Anchor = AnchorStyles.Left | AnchorStyles.Right;
  62. name.TextAlign = HorizontalAlignment.Center;
  63. table.Controls.Add(name, 1, i);
  64. TextBox inc = new TextBox();
  65. inc.Anchor = AnchorStyles.Left | AnchorStyles.Right;
  66. inc.TextAlign = HorizontalAlignment.Center;
  67. inc.Text = "in-" + i;
  68. table.Controls.Add(inc, 2, i);
  69. TextBox outc = new TextBox();
  70. outc.Anchor = AnchorStyles.Left | AnchorStyles.Right;
  71. outc.TextAlign = HorizontalAlignment.Center;
  72. outc.Text = "out-" + i;
  73. table.Controls.Add(outc, 3, i);
  74. }
  75. /// <summary>
  76. /// 删除一行
  77. /// </summary>
  78. /// <param name="sender"></param>
  79. /// <param name="e"></param>
  80. private void button2_Click(object sender, EventArgs e)
  81. {
  82. // 行数
  83. int row = 0;
  84. for (int i = 0; i < table.Controls.Count; i++)
  85. {
  86. Control ctl = table.Controls[i];
  87. // 默认CheckBox为行首控件
  88. if (ctl.GetType().ToString().Contains("CheckBox"))
  89. {
  90. CheckBox rb = (CheckBox)ctl;
  91. if (rb.Checked)
  92. {
  93. // 删除当前行的所有控件
  94. for (int j = 0; j < table.ColumnCount;j++ )
  95. {
  96. table.Controls.RemoveAt(i);
  97. }
  98. // 移动,当前行row的下行往上移动
  99. for (int k = row; k < table.RowCount-1;k++ )
  100. {
  101. Control ctlNext = table.GetControlFromPosition(0, k + 1);
  102. table.SetCellPosition(ctlNext, new TableLayoutPanelCellPosition(0, k));
  103. Control ctlNext1 = table.GetControlFromPosition(1, k + 1);
  104. table.SetCellPosition(ctlNext1, new TableLayoutPanelCellPosition(1, k));
  105. Control ctlNext2 = table.GetControlFromPosition(2, k + 1);
  106. table.SetCellPosition(ctlNext2, new TableLayoutPanelCellPosition(2, k));
  107. Control ctlNext3 = table.GetControlFromPosition(3, k + 1);
  108. table.SetCellPosition(ctlNext3, new TableLayoutPanelCellPosition(3, k));
  109. }
  110. //移除最后一行,最后为空白行
  111. table.RowStyles.RemoveAt(table.RowCount - 1);
  112. table.RowCount = table.RowCount - 1;
  113. break;
  114. }
  115. row++;//行数加加
  116. }
  117. }
  118. // 重新计算高度,否则最后一行偏大
  119. table.Height = table.RowCount * 40;
  120. }
  121. }
  122. }




效果图:





留言

熱門文章