删除隐藏的控件

时间:2017-02-06 17:17:30

标签: c# winforms

在运行时,我必须决定是否显示一堆控件。 我在这个表格上工作: My form

在某些情况下,我想隐藏所有控件但是"行字体大小"标签,它的Combobox和"关闭"按钮。这样做时,我想移动剩余的组件并调整主窗体的大小,使它看起来不错。

正如评论中所建议的那样,我尝试将FlowLayoutPanel与面板一起使用。 CheckedBoxList的一个面板,每对一个面板(标签,Combobox),因为我想将标签和组合框保持在同一行。

通过这个解决方案,我有两个问题:

  1. 需要管理的更多组件:我现在必须隐藏面板而不是其他初始组件
  2. 自动调整大小不再有效:如果我调整主窗体的大小,内部组件不会再改变大小。
  3. 另外,我查看了TableLayoutPanel,它并没有为我看一个选项,因为我在每行中有不同的列数。第一行,我只有一个CheckedBoxList,在第二行有一个标签和一个组合框...

    是否有任何建议可以解决此问题并为所有控件保留自动调整大小功能?

1 个答案:

答案 0 :(得分:0)

在Winforms中,它在后台使用网格类型的布局。所以你必须自己控制布局。最简单的方法是创建一个名为RefreshLayout()的方法,并在您隐藏或显示按钮时随时调用此方法。所以你的情况会是这样的:

if (condition)
{
    buttonDown.Hide();
    RefreshLayout();
}

RefreshLayout()方法中,您需要确定按钮是隐藏还是可见,然后按按钮大小向上或向下移动按钮下方的所有控件。此外,您可能希望更改表单本身的高度。所以它看起来像这样:

public void RefreshLayout()
{
    int offset;

    if (buttonDown.Visible)
    {
        // The button is visible
        offset = buttonDown.Height;
    } 
    else
    {
        // The button is hidden
        offset = buttonDown.Height * -1;
    }

    // For each control under the button...

    control1.Location.Y = control1.Location.Y + offset;
    control2.Location.Y = control2.Location.Y + offset;
    // and so forth, for each control
}