运行时生成的控件的 DockStyle Fill

7
我尝试在C# Winforms中实现一个非常简单的功能,但是遇到了很大的问题。我在TabPage上有两个GroupBox,一个在右侧停靠,一个在底部停靠。此外,这个页面上还有一个图表(System.Windows.Forms.DataVisualization.Charting)。该图表需要填充页面上剩余的空间。
首先,我遇到了图表隐藏在两个GroupBox后面而仍然填充整个页面的问题。然而,我发现可以通过使用“BringToFront”(或重新排序文档大纲顺序)来解决这个问题,然后图表就能正确停靠,并且不会重叠任何其他控件。
但是,我现在想要在运行时向该页面添加一个图表,它又再次填充整个页面并隐藏在其他控件后面。我该如何使其正常工作?
编辑: 忘记提到调用"BringToFront"会抛出异常"Width must be greater than 0px"。
chart_TapChart = new Chart();
chart_TapChart.Dock = DockStyle.Fill;
chart_TapChart.BringToFront();
GroupBox gp1 = new GroupBox();
gp1.Dock = DockStyle.Right;
GroupBox gp2 = new GroupBox();
gp2.Dock = DockStyle.Bottom;
this.Controls.Add(chart_TapChart);    <--this refers to tabpage
this.Controls.Add(gp1);
this.Controls.Add(gp2);

这就是代码的要点。只是简单明了的东西。这段代码包含在一个TabPage中。TabPage被添加到TabController中。 - ImGreg
http://msdn.microsoft.com/en-us/library/ms404360(v=vs.80).aspx 给出了一些很好的建议... - poy
6个回答

5
原来,您必须等待TabPage已经被查看(您必须以编程方式调用yourtabpage.select()),然后搜索该选项卡页面上的控件,找到图表,并在其上调用“BringToFront”。 在将控件添加到页面之前,可能已设置了Dock.Fill。
在选项卡页呈现之前,无法设置其z-index。

刚遇到了类似的问题。在TabPage中以编程方式设置为DockStyle.Fill的面板,除非在TabControl上将TabPage设置为SelectedTab属性后再设置DockStyle,否则不会按预期行事。 - Gareth

2
不要将其停靠。相反,应使用锚定。
Chart.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Top;

编辑:

正如Jon指出的那样,调用:

Chart.BringToFront();
Chart.Dock = DockStyle.Fill;

应该允许文档与表单上的其他控件协调使用。


我已经尝试过这个,但它并没有像我想要的那样填充空白区域。使用 Dock.Fill 会更理想。 - ImGreg
Dock.Fill不起作用,因为它总是填充其父容器并覆盖其他控件。将左、上、宽度和高度设置为要使用的空间,然后将其锚定。 - Coltech
1
Coltech - Dock.Fill 可以与其他停靠在顶部/底部/左侧/右侧的控件很好地协作。Z-顺序决定了它的工作方式。如果图表在顶部,它将不会填充整个容器。 - Jon B
1
约翰,我不知道那个!那么只需要调用 Chart.BringToFront(),DockStyle.Fill 就会起作用吗? - Coltech
@Coltech,我也花了几个小时才弄明白这个问题,但后来我又随机遇到了这个问题。真是太令人沮丧了! - ImGreg
显示剩余2条评论

1
我们也遇到了“高度必须大于0像素”的问题。原来问题/解决方案是显示设置。将显示大小设置为大于100%的任何值,会导致某些元素的DockStyle.Fill填充整个可用空间,使图表在初始化时高度为0px。使用锚点而不是使用Fill可以解决问题,但这实际上是图表控件内部的错误。

1

我通过将图表最小大小设置为10,10来解决了这个问题,并保持我的码头填充。


1
我曾遇到一个与图表控件类似的问题,当高度设置为零时,它会崩溃。错误信息是“高度必须大于0像素”。将停靠方式从填充更改为无,并设置锚定属性即可解决。看起来像是图表控件中的一个 bug,但很难找到更多信息...

0
将 Dockstyle 设置为 None 可以加载窗体,但我确实需要为一些图表使用 Fill 停靠样式。我通过在设计器中设置 myChart.Dock = DockStyle.None,然后在代码的 Form.Load 事件末尾设置 myChart.Dock = DockStyle.None 来解决了这个问题。现在程序可以无错误地加载且图表大小正确。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接