Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何自动调整窗体大小以适应其内容?_C#_.net_Winforms - Fatal编程技术网

C# 如何自动调整窗体大小以适应其内容?

C# 如何自动调整窗体大小以适应其内容?,c#,.net,winforms,C#,.net,Winforms,我正在尝试实施以下行为: 表单上有一个tab控件。在那个选项卡控件上有一个树状视图。为了防止出现滚动条,我希望表单在第一次显示时根据treeview的内容更改其大小 如果treeview的节点太多,无法以表单的默认大小显示,则表单应更改其大小,以便treeview上没有垂直滚动条(最大为屏幕大小允许的最大大小) 我需要知道的是,是否有可能通过控件的属性实现这种行为。我确信这可以通过编程方式计算和设置元素的大小来实现,但我想知道是否有办法通过设置AutoSizeMode等来实现 [更新] 这是我的

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

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

如果treeview的节点太多,无法以表单的默认大小显示,则表单应更改其大小,以便treeview上没有垂直滚动条(最大为屏幕大小允许的最大大小)

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

[更新]


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

使用各种大小属性(停靠、锚定)或容器控件(面板、TableLayoutPanel、FlowLayoutPanel等)只能指定从外部控件到内部控件的大小。但是在.Net框架中,没有任何东西(工作)允许通过子控件的大小来指定容器的大小。我也错过了这几次,并尝试了自动大小属性,但它从来没有工作


因此,您所能做的就是尝试手动完成这项工作,抱歉。

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

// 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);
注意。这假设TreeView是表单上唯一的控件。设置requiredFormHeight变量时,需要考虑围绕treeview的其他控件和高度要求,例如您提到的tabcontrol


(不过,我同意@jgauffin的观点,并评估每次加载表单时未经用户同意就调整表单大小的要求背后的原理-可能让用户定位和调整表单大小,并记住这一点??)

使用AutoSize和AutoSizeMode属性

例如:

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...
}
发件人:

为了最大限度地提高生产效率,Windows窗体设计器将
Form
类的
AutoSize
属性在设计时,表单 其行为类似于将
自动调整大小
属性设置为false, 不管它的实际设置如何在运行时,无特殊要求 进行调整,并应用
AutoSize
属性作为 由属性设置指定


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

以父级形式:

frmEmployee frm = new frmEmployee();
frm.MdiParent = this;
frm.Dock = DockStyle.Fill;
frm.Show();
this.WindowState = FormWindowState.Maximized;
在子窗体中(加载事件):

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

如果您试图根据表格来调整内容,以下内容将有所帮助。当我试图调整表单上的内容以适应表单的大小时,它会帮助我

this.contents.Size=新尺寸(this.ClientRectangle.Width, 此参数为0.ClientRectangle.Height)

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

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();

我使用了这个代码,它工作得很好

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;

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

    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;
    }

是的,在这个方向上,我也总是手动完成@jgaufin的警告确实适用!实际上,AutoSize属性确实可以工作,只是不是很好,特别是如果您还尝试停靠或锚定任何包含的控件。WinForms通常会在这一点上出现精神崩溃。您应该根据控件自动调整容器大小,或者将控件锚定/停靠到容器,但决不能同时将两者都锚定/停靠。事实上,擦掉那个。。。避免自动调整大小。你的理智会感谢你的。同意,避免使用autosize,即使它可以工作。不使用它的另一个重要原因是,它阻止用户在运行时手动更改窗体的大小。您几乎总是希望用户能够手动控制窗体的大小,如果您确实希望自动调整窗体的大小,它通常会伴随一个事件,因此只需使用一些代码来处理事件以进行调整大小,而不是将整个窗体行为的属性设置为自动调整大小。您还可以取消停靠、自动调整大小和重新停靠<代码>dataGridView1.Dock=DockStyle.None;dataGridView1.AutoSize=true;this.AutoSize=true;dataGridView1.Dock=DockStyle.Fill我尝试过这样做,但我发现这种方法与停靠和锚定相结合,有时会导致非常奇怪的行为。因此,它本身可能工作正常,但如果您有任何类型的对接,那么它可能不值得麻烦。System.Windows.SystemParameters已过时,无法与当前版本的.NET一起工作。考虑修改。我试过了,但是当中央锚点列表框的内容增加时,我仍然无法让窗体增长。相反,我在列表框中得到了一个滚动条。我在列表框本身上没有看到任何自动调整大小的属性。我猜我需要把它放在一个自动大小的面板中,作为停靠满?我想添加项目,调整大小,然后允许用户也调整大小。所以我所做的是
AutoSize=true;(e)
调整大小以适应新控件,然后保存新大小
var newSize=new System.Drawing.size(this.Width,this.Height)然后关闭自动调整大小,使其保持用户控制。但是,执行此操作时,表单会恢复到以前的大小,因此您可以通过
this.size=newSize
强制它。还有维奥拉!根据需要自动调整大小,并保持用户可调。我想我应该和大家分享。我必须模仿origina创建自己的“警报对话框”实现