Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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#_Winforms_Scrollbar_Tablelayoutpanel - Fatal编程技术网

C# 滚动条仅显示第一个元素

C# 滚动条仅显示第一个元素,c#,winforms,scrollbar,tablelayoutpanel,C#,Winforms,Scrollbar,Tablelayoutpanel,我有一个非常简单的windows窗体。从下面的图片中可以看到,滚动条只出现在第一项中,但一旦我通过拖动边框使窗体变大,滚动条就会消失。这背后的原因是什么 表单的代码如下所示: var tlp1 = new TableLayoutPanel(); tlp1.Dock = DockStyle.Top; tlp1.AutoSize = true; tlp1.BackColor = Color.Bisque; var tlp2 = new TableLayoutPanel(); tlp2.Dock

我有一个非常简单的windows窗体。从下面的图片中可以看到,滚动条只出现在第一项中,但一旦我通过拖动边框使窗体变大,滚动条就会消失。这背后的原因是什么

表单的代码如下所示:

var tlp1 = new TableLayoutPanel();
tlp1.Dock = DockStyle.Top;
tlp1.AutoSize = true;
tlp1.BackColor = Color.Bisque;

var tlp2 = new TableLayoutPanel();
tlp2.Dock = DockStyle.Fill;
tlp2.BackColor = Color.DarkSeaGreen;

page.Controls.Add(tlp2);
page.Controls.Add(tlp1);

for (var i = 0; i < 10; i++)
{
    tlp1.Controls.Add(new TextBox()
    {
        Text = string.Format("page1. {0}", i)
    });

    tlp2.Controls.Add(new TextBox()
    {
        Text = string.Format("page2. {0}", i)
    });
}

page.AutoScroll = true;
var tlp1=新的TableLayoutPanel();
tlp1.Dock=DockStyle.Top;
tlp1.AutoSize=true;
tlp1.BackColor=Color.Bisque;
var tlp2=新的TableLayoutPanel();
tlp2.Dock=DockStyle.Fill;
tlp2.BackColor=Color.DarkSeaGreen;
page.Controls.Add(tlp2);
页面控件添加(tlp1);
对于(变量i=0;i<10;i++)
{
tlp1.Controls.Add(新文本框()
{
Text=string.Format(“page1.{0}”,i)
});
tlp2.Controls.Add(新文本框()
{
Text=string.Format(“page2.{0}”,i)
});
}
page.AutoScroll=true;

可滚动区域将是
LayoutEngine
排列后添加到
ScollableContainer
的所有控件的最大值(x+宽度,y+高度)

由于
tlp2.Dock=DockStyle.Fill
,其ClientRectangle(x、y、宽度、高度)是任何可用空间。换句话说,由于米色面板占据了所有可用高度,因此绿色面板客户端高度(
ClientRectangle.height
)为零。当您增加主窗口的高度时,将有更多的空间可用,并且额外的高度将分配给绿色面板。但是,当设置为
DockStyle.Fill
时,绿色面板不会满足空间需求

如果设置了以下各项:

tlp2.Dock = DockStyle.Bottom;
tlp2.AutoSize = true;
然后,您将有一个滚动条,它横跨两个面板的整个高度。或者另一种方法是将面板添加到垂直
FlowLayoutPanel
,例如

class FormTab : Form {

    public FormTab() {
        TabControl tc = new TabControl { Dock = DockStyle.Fill };
        TabPage page = new TabPage();
        var tlp1 = new TableLayoutPanel();
        tlp1.Dock = DockStyle.Top;
        tlp1.AutoSize = true;
        tlp1.BackColor = Color.Bisque;

        var tlp2 = new TableLayoutPanel();
        tlp2.Dock = DockStyle.Bottom;
        tlp2.AutoSize = true;
        tlp2.BackColor = Color.DarkSeaGreen;

        VFLP p = new VFLP();
        p.SuspendLayout();
        p.Controls.Add(tlp2);
        p.Controls.Add(tlp1);
        page.Controls.Add(p);
        //page.Controls.Add(tlp2);
        //page.Controls.Add(tlp1);

        for (var i = 0; i < 10; i++) {
            tlp1.Controls.Add(new TextBox() {
                Text = string.Format("page1. {0}", i)
            });

            tlp2.Controls.Add(new TextBox() {
                Text = string.Format("page2. {0}", i)
            });
        }

        this.DoubleClick += delegate {
            Size s = page.GetPreferredSize(Size.Empty);
            int bp = 1;
        };

        tc.TabPages.Add(page);
        page.AutoScroll = true;
        Controls.Add(tc);
        p.ResumeLayout(true);
    }

    class VFLP : FlowLayoutPanel {

        public VFLP() {
            this.BackColor = Color.AliceBlue;
            WrapContents = false;
            FlowDirection = FlowDirection.TopDown;
            AutoSize = true;
            AutoSizeMode = AutoSizeMode.GrowAndShrink;
        }

        public override Size GetPreferredSize(Size proposedSize) {
            Size s = base.GetPreferredSize(proposedSize);
            Size s2 = Size.Empty;
            foreach (Control c in Controls) {
                Size s3 = c.GetPreferredSize(Size.Empty);
                Padding m = c.Margin;
                s2.Height += s3.Height + m.Vertical;
                int w = s3.Width + m.Horizontal;
                if (w > s2.Width)
                    s2.Width = w;
            }

            return s2;
        }
    }
}
类表单选项卡:表单{
公共表单选项卡(){
TabControl tc=new TabControl{Dock=DockStyle.Fill};
TabPage=新TabPage();
var tlp1=新的TableLayoutPanel();
tlp1.Dock=DockStyle.Top;
tlp1.AutoSize=true;
tlp1.BackColor=Color.Bisque;
var tlp2=新的TableLayoutPanel();
tlp2.Dock=DockStyle.Bottom;
tlp2.AutoSize=true;
tlp2.BackColor=Color.DarkSeaGreen;
VFLP=新的VFLP();
p、 SuspendLayout();
p、 控件。添加(tlp2);
p、 控制。添加(tlp1);
页。控件。添加(p);
//page.Controls.Add(tlp2);
//页面控件添加(tlp1);
对于(变量i=0;i<10;i++){
tlp1.Controls.Add(新文本框(){
Text=string.Format(“page1.{0}”,i)
});
tlp2.Controls.Add(新文本框(){
Text=string.Format(“page2.{0}”,i)
});
}
this.DoubleClick+=委托{
大小s=page.GetPreferredSize(Size.Empty);
int-bp=1;
};
tc.TabPages.Add(第页);
page.AutoScroll=true;
添加(tc);
p、 简历布局(真实);
}
VFLP类:FlowLayoutPanel{
公共VFLP(){
this.BackColor=Color.AliceBlue;
WrapContents=false;
FlowDirection=FlowDirection.TopDown;
AutoSize=true;
AutoSizeMode=AutoSizeMode.growthandshrink;
}
公共覆盖大小GetPreferredSize(大小proposedSize){
大小s=基本。GetPreferredSize(proposedSize);
大小s2=大小。空;
foreach(控件中的控件c){
大小s3=c.GetPreferredSize(大小为空);
填充m=c.边距;
s2.高度+=s3.高度+m.垂直;
int w=s3.宽度+m.水平;
如果(w>s2.宽度)
s2.宽度=w;
}
返回s2;
}
}
}

我相信您必须为
TableLayoutPanel
设置
AutoScroll=true
。@正如您所说的,Bauss设置将滚动条放在第二个面板内,如中所示。如果TLP的大小大于实际面板,您可以尝试与面板比较大小,然后强制打开滚动条。