我的表格布局面板有一列三行。(一个停靠在每个单元格中的填充面板上。)
现在我希望能够隐藏/显示行。我希望任何时候都只看到一行(基于用户对某些单选按钮的选择),并且我想调整大小以填充 TableLayoutPanel 的所有区域。
我怎样才能做到这一点?有什么想法吗?
我的表格布局面板有一列三行。(一个停靠在每个单元格中的填充面板上。)
现在我希望能够隐藏/显示行。我希望任何时候都只看到一行(基于用户对某些单选按钮的选择),并且我想调整大小以填充 TableLayoutPanel 的所有区域。
我怎样才能做到这一点?有什么想法吗?
如果 TableLayoutPanel 中的行是自动调整大小的,那么隐藏内容面板也会隐藏面板所在的单元格。
我建议将其他行的高度设置为 0 是最简单的方法:
第一行:
this.tableLayoutPanel1.RowStyles[1].Height = 0;
试试这个
TableLayoutPanel1.ColumnStyles[1].SizeType = SizeType.Absolute;
TableLayoutPanel1.ColumnStyles[1].Width = 0;
那你为什么用a TableLayoutPanel
?
只需Panel
在表单上放三个 s,将每一行的内容填入每个人,并将Dock
所有三个面板的属性设置为Fill
。将两个面板Visible = false
和一个设置为true
。
如果您想查看另一个面板,只需使其可见并隐藏另外两个(基于您的单选按钮设置)。
我的情况类似。我需要一个具有 4 行的 TableLayoutPanel,每行都需要根据复选框选择可见。因此,我可以显示 1 - 4,而不是一次只显示一行。在设计了 1 列和 4 行的布局后,添加了控件并将每个控件的 Dock 设置为 Fill。然后在复选框的单个 CheckedChanged 事件处理程序中,我编码如下所示。这是一种蛮力方法,但是,嘿......它有效!
private void checkBox_CheckedChanged(object sender, EventArgs e)
{
this.SuspendLayout();
int seldCount = checkBox1.Checked ? 1 : 0;
seldCount += checkBox2.Checked ? 1 : 0;
seldCount += checkBox3.Checked ? 1 : 0;
seldCount += checkBox4.Checked ? 1 : 0;
float pcnt = 0;
if (seldCount == 1)
pcnt = 1;
if (seldCount == 2)
pcnt = 0.5f;
if (seldCount == 3)
pcnt = 0.33f;
if (seldCount == 4)
pcnt = 0.25f;
int newHeight = (int)(tableLayoutPanel1.Height * pcnt);
if (checkBox1.Checked)
{
tableLayoutPanel1.RowStyles[0].SizeType = SizeType.Percent;
tableLayoutPanel1.RowStyles[0].Height = newHeight;
}
else
{
tableLayoutPanel1.RowStyles[0].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[0].Height = 0;
}
if (checkBox2.Checked)
{
tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Percent;
tableLayoutPanel1.RowStyles[1].Height = newHeight;
}
else
{
tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[1].Height = 0;
}
if (checkBox3.Checked)
{
tableLayoutPanel1.RowStyles[2].SizeType = SizeType.Percent;
tableLayoutPanel1.RowStyles[2].Height = newHeight;
}
else
{
tableLayoutPanel1.RowStyles[2].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[2].Height = 0;
}
if (checkBox4.Checked)
{
tableLayoutPanel1.RowStyles[3].SizeType = SizeType.Percent;
tableLayoutPanel1.RowStyles[3].Height = newHeight;
}
else
{
tableLayoutPanel1.RowStyles[3].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[3].Height = 0;
}
this.ResumeLayout();
}
要隐藏行试试这个!!
tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[1].Height = 0;
我有类似的任务要做,我的解决方案如下:
将 TableLayoutPanel 添加到您的表单(或任何容器)。
将 TableLayoutPanel 的列数和行数设置为 1,将大小设置为 100%。
将 Dock 设置为 Fill。
将 GrowStyle 设置为 fixedSize。
将 AutoSize 设置为 true。
然后以编程方式添加所有三个表单/控件,您必须根据单选按钮选择显示其中一个。确保其中只有一个可见。这可以通过初始 FirstControl.Show(); 然后在每个 RadioButton 事件上隐藏当前一个并显示另一个。您可能会“记住”局部变量(例如:“currentlyVisibleControl”当前可见的引用)
注意:如果您一次 .Show() 不止一个。然后 TableLayoutPanel 将触发异常,即它已满且无法再添加任何项目。
PS 在我自己的示例中,我在 MDI 窗口中有 TableLayoutPanel 和三个表单,它们在按钮单击时相互替换,所以我认为复制我的源代码会使“语言”示例复杂化。
PPS 根据我的经验,Visual Studio 有时会在设计模式下做一些奇怪的事情。我必须删除并重新添加 TableLayoutPanel 才能正确设置属性并在设计器和运行时都获得结果。因此,如果设计器屏幕上未显示自动调整大小或绝对/百分比值,则可能是设计器问题,而不是您的问题。只需删除它并重试。
我试着玩弄Height
andSizeType
属性,但它给了我奇怪的结果。例如,目标行上的标签被隐藏,但文本框没有。
这是我使用@arbiter 的隐藏行的子控件的建议提出的扩展类。
// these methods only works on rows that are set to AutoSize
public static class TableLayoutPanelExtensions
{
public static void HideRows(this TableLayoutPanel panel, params int[] rowNumbers)
{
foreach (Control c in panel.Controls)
{
if (rowNumbers.Contains(panel.GetRow(c)))
c.Visible = false;
}
}
public static void ShowRows(this TableLayoutPanel panel, params int[] rowNumbers)
{
foreach (Control c in panel.Controls)
{
if (rowNumbers.Contains(panel.GetRow(c)))
c.Visible = true;
}
}
}