2012-05-10 364 views
3

我想要做的是展开和折叠我的winform中间。我知道这里有类似的问题,但他们没有真正做我需要的。我已阅读关于使用FlowLayoutPanel,但我不能得到它的工作。展开和折叠winform

的是我想达到的一个例子是:

我有我的WinForm(例如)

example

当我点击button1应该隐藏在中间的文本框和收缩形式隐藏空间,反之亦然,当我点击button2。无论哪种方式,button3应保持低于文本框的位置或不显示。

到目前为止,我的尝试要么隐藏文本框,并且不对表单做任何事情,或者缩小比应该更多的东西。我目前已将AutoSize设置为trueAutoSizeModeGrowAndShrink

我已经看到,能做到这一点或类似的控制,但他们有箭头或小按钮来扩展形式,我需要的只是按钮来做到这一点。

是否有一个简单的方法来做到这一点?

任何帮助表示赞赏。

更新

我已经试过的高度设置为0和隐藏文本框的建议,但它只是崩溃的形式,而不是中间的右侧。

Screenshot

+0

将height属性设置为0并隐藏它? 使用你知道它的高度是从放置第三个按钮的位置的y坐标减去,并从表单y的大小中去掉文本框的高度,以相应地缩小。只要将它们添加回来,当你想要显示它 – RhysW

+0

我最近写了类似的东西,并在网上发现了几个例子。例如,请看http://www.codeproject.com/Articles/53318/C-Custom-Control-Featuring-a-Collapsible-Panel或http://collapsiblepanel.codeplex.com/releases/view/25409。还有大量的第三方控件可以做到这一点; DevExpress有一个可折叠的面板控制。你可以从你的按钮模拟面板标题的点击事件(并且不显示面板标题!) – dash

回答

1

您需要形式的原始高度存储在一个变量,这样就可以在以后恢复它,当你再次展开。另外,如果你锚将Button3的底部,你不会有调整大小时处理:

public partial class Form1 : Form { 
    private int originalHeight; 

    public Form1() { 
    InitializeComponent(); 
    button3.Anchor = AnchorStyles.Left | AnchorStyles.Bottom; 
    } 

    protected override void OnLoad(EventArgs e) { 
    originalHeight = this.Height; 
    base.OnLoad(e); 
    } 

    private void button1_Click(object sender, EventArgs e) { 
    textBox1.Visible = false; 
    this.Height = originalHeight - textBox1.Height; 
    } 

    private void button2_Click(object sender, EventArgs e) { 
    this.Height = originalHeight; 
    textBox1.Visible = true; 
    } 
} 

在表单上离开AutoSize=false;,因为你是在处理自己调整。

我会考虑使用一个按钮来处理窗体的切换,因为当窗体被展开时Button2是无用的,反之亦然,如果窗体被折叠,Button1是无用的。

+0

这就是BRILLIANT! :)正是我在找什么。我会按照你的建议做1个按钮的切换,这会更好,非常感谢! –

+1

虽然这种方法很有效,但我相信这是实现你想要的一种可怕的方式。布局上的任何更改都需要大量的代码更改,并引入其他无用的变量。 (不要说这不是你的问题的答案:这是......这只是一个非常糟糕的方式) – Jcl

0

隐藏控制并相应地设置高度属性。

1

这必须使用面板和对接来完成。使用AutoSize是错误的方法。

1

我知道,我迟到了比赛,但因为我刚刚解决了同样的问题,我想向您提供我的解决方案:

正如你已经提到的,你可以使用FlowLayoutPanel做的工作。只要把它放进你的表格。设置的FlowDirection到TopDown,并添加您的按钮和文本框以正确的顺序。 完成后,设置窗体的AutoSize和FlowLayoutPanel的为真,并设置AutoSizeModeGrowAndShrink

防止宽度崩溃当

你的问题是自动调整,如果您设置autoSize为true,禁用/隐藏文本框,宽度将被降低。发生这种情况是因为您的文本框是窗体上最宽的控件,并且如果它被隐藏,宽度将减小到其余控件所需的宽度。为了防止发生这种情况,只需将按钮放入与文本框宽度相同的面板控件即可。 现在,如果您的文本框处于隐藏状态,则宽度将保持为所需的宽度。

使用复选框以展开/折叠

而不是使用两个按钮,我喜欢用一个复选框来展开/折叠。用于调整大小的整个编码将减少到添加checkbox1.Checked属性的一个结合线到文本框的属性Visibility

textbox1.DataBindings.Add(“可见”,checkbox1,“检查”)