我的tablelayout面板有一列三行。 (一个停靠在每个单元格中的“填充”面板。)
现在我希望能够隐藏/显示行。我希望任何时候只能看到一行(根据用户选择的一些单选按钮),我想调整大小,以便填充TableLayoutPanel的所有区域。
我该怎么做?有什么想法吗?
答案 0 :(得分:19)
如果TableLayoutPanel中的行已自动调整,则隐藏内容面板将隐藏面板放置的单元格。
答案 1 :(得分:14)
我建议将其他行高度设置为0是最简单的方法:
第一行:
this.tableLayoutPanel1.RowStyles[1].Height = 0;
答案 2 :(得分:8)
试试这个
TableLayoutPanel1.ColumnStyles[1].SizeType = SizeType.Absolute;
TableLayoutPanel1.ColumnStyles[1].Width = 0;
答案 3 :(得分:6)
我的情景类似。我需要一个包含4行的TableLayoutPanel,每行需要根据复选框选择显示。因此,我不是一次只显示一行,而是显示1 - 4。 在设计了1列和4行的布局之后,添加了控件并将Dock设置为Fill for each。 然后在复选框的单个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();
}
答案 4 :(得分:5)
那么你为什么要使用TableLayoutPanel
?
只需在表单上放置三个Panel
,向每个人填写每行的内容,并将所有三个面板的Dock
属性设置为Fill
。将两个小组Visible = false
和一个小组设置为true
。
如果您想看另一个面板,只需将其显示为隐藏另外两个面板(根据您的单选按钮设置)。
答案 5 :(得分:3)
我有类似的任务要做,我的解决方案如下:
将TableLayoutPanel添加到表单(或任何容器)。
将TableLayoutPanel的列数和行数设置为1,将大小设置为100%。
将Dock设置为Fill。
将GrowStyle设置为fixedSize。
将AutoSize设置为true。
然后以编程方式添加所有三个表单/控件,其中一个必须根据单选按钮选项显示。确保只有其中一个可见。这可以通过初始FirstControl.Show();然后在每个RadioButton事件中隐藏当前的一个并显示另一个。你可以在本地变量中“记住”(例如:“currentVisibleControl”当前可见的参考)
注意:如果你将.Show()不止一次。然后TableLayoutPanel将触发它已满的异常,并且不能再添加任何项目。
P.S。在我自己的例子中,我在MDI窗口中有TableLayoutPanel,并且三个表单在按钮点击时互相替换,所以我认为复制我的源代码会使“口头”示例变得复杂。
P.P.S。根据我的经验,Visual Studio有时会在设计模式中做一些奇怪的事情。我必须删除并重新添加TableLayoutPanel以正确设置属性并在设计器和运行时获得结果。因此,如果在设计器屏幕上没有描绘自动调整大小或绝对/百分比值,则可能是设计师问题而不是您的问题。只是删除它并重新编译。
答案 6 :(得分:3)
隐藏行尝试这个!!
tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[1].Height = 0;
答案 7 :(得分:0)
我尝试鬼混Height
和SizeType
属性,但这给了我奇怪的结果。例如,目标行上的标签被隐藏,而文本框未被隐藏。
这里是一个扩展类,我使用@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;
}
}
}