如何调整表单大小以自动适应其内容?

时间:2011-05-11 10:12:58

标签: c# .net winforms

我正在尝试实现以下行为:

在表格上有一个tabcontrol。在那个tabcontrol上有一个树视图。为了防止出现滚动条,我希望表单在第一次显示时根据树视图的内容更改其大小。

如果树视图中有太多节点要显示在表单的默认大小上,则表单应更改其大小,以便树视图上没有垂直滚动条(最大允许的最大大小为屏幕大小) )。

我需要知道的是,是否可以通过控件的属性实现此行为。我确信这可以通过以编程方式计算和设置元素的大小来实现,但我想知道是否有办法通过AutoSizeMode等设置来实现这一点。

[UPDATE]

这是我的应用程序的用户看到的第一个对话框:它是一个用于选择要使用的数据库的对话框。这是一个数据库列表,带有tabcontrol,buttens等。如果列表太长,会出现滚动条,我的同事希望它们消失。

9 个答案:

答案 0 :(得分:26)

使用AutoSize和AutoSizeMode属性。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.autosize.aspx

一个例子:

private void Form1_Load(object sender, EventArgs e)
{
    // no smaller than design time size
    this.MinimumSize = new System.Drawing.Size(this.Width, this.Height);

    // no larger than screen size
    this.MaximumSize = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, (int)System.Windows.SystemParameters.PrimaryScreenHeight);

    this.AutoSize = true;
    this.AutoSizeMode = AutoSizeMode.GrowAndShrink;

    // rest of your code here...
}

答案 1 :(得分:14)

通过使用各种大小调整属性(Dock,Anchor)或容器控件(Panel,TableLayoutPanel,FlowLayoutPanel等),您只能指定从外部控件到内部控件的大小。但是.Net框架中没有任何(工作)允许通过子控件的大小来决定容器的大小。我也错过了几次并尝试了AutoSize属性,但它从未奏效。

所以你所能做的就是尝试手动完成这些工作,抱歉。

答案 2 :(得分:11)

来自MSDN

  

为了最大限度地提高工作效率,Windows窗体设计器会隐藏   AutoSize类的Form属性。 在设计时,表单   表现得好像AutoSize属性设置为 false ,   无论其实际设置如何。 在运行时,没有特别的   住宿已经完成,AutoSize属性被应用为   由属性设置指定。

答案 3 :(得分:5)

您可以通过计算节点的高度,将其乘以节点数,然后相应地设置表单的MinimumSize属性来计算TreeView所需的高度。

// assuming the treeview is populated!
nodeHeight = treeview1.Nodes[0].Bounds.Height;

this.MaximumSize = new Size(someMaximumWidth, someMaximumHeight);

int requiredFormHeight = (treeView1.GetNodeCount(true) * nodeHeight);

this.MinimumSize = new Size(this.Width, requiredFormHeight);

NB。这假设treeview1是表单上唯一的控件。设置requiredFormHeight变量时,您需要允许树视图周围的其他控件和高度要求,例如您提到的tabcontrol。

(但我会同意@jgauffin并评估在未经用户同意的情况下每次加载时调整表单大小的要求背后的理由 - 可能让用户定位并调整表单大小并记住它而不是??)< / em>的

答案 4 :(得分:5)

这可能很有用。 它将新表单的大小调整为用户控件,然后将用户控件锚定到新表单:

Form f = new Form();
MyUserControl muc = new MyUserControl();
f.ClientSize = muc.Size;
f.Controls.Add(muc);
muc.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
f.ShowDialog();

答案 5 :(得分:3)

这项技术解决了我的问题:

以父母形式:

frmEmployee frm = new frmEmployee();
frm.MdiParent = this;
frm.Dock = DockStyle.Fill;
frm.Show();

在子表单中(加载事件):

this.WindowState = FormWindowState.Maximized;

答案 6 :(得分:3)

如果您尝试根据表单填写内容,则以下内容将有所帮助。当我试图在表单上调整内容以适应表单的大小时,它对我有所帮助。

  

this.contents.Size = new Size(this.ClientRectangle.Width,   this.ClientRectangle.Height);

答案 7 :(得分:0)

我使用了这段代码而且效果很好

const int margin = 5;
        Rectangle rect = new Rectangle(
            Screen.PrimaryScreen.WorkingArea.X + margin,
            Screen.PrimaryScreen.WorkingArea.Y + margin,
            Screen.PrimaryScreen.WorkingArea.Width - 2 * margin,
            Screen.PrimaryScreen.WorkingArea.Height - 2 * (margin - 7));
        this.Bounds = rect;

答案 8 :(得分:0)

我在我的项目中使用此代码,对我有用。

    private void Form1_Resize(object sender, EventArgs e)
    {
        int w = MainPanel.Width; // you can use form.width when you don't use panels

        w = (w - 120)/4; // 120 because set 15px for each side of panels
                         // and put panels in FlowLayoutPanel
                         // 4 because i have 4 panel boxes
        panel1.Width = w;
        panel2.Width = w;
        panel3.Width = w;
        panel4.Width = w;
    }

enter image description here