我正在尝试构建一个表单布局,它将满足以下要求:
我的问题是让panel2填充在panel1和panel3之后留下的整个地方。因此,如果panel1和panel3都具有固定高度100,并且窗体具有高度500,那么panel2应该具有300高度,如果窗体将被调整为600,则panel2也应该调整为400等等。
我正在尝试一些底座组合,尝试将panel1 dock设置为top,panel3设置为bottom,panel2设置为fill,但它提供的结果超出预期。我知道我可以处理窗体调整大小事件并将panel2调整到一个可以保留的大小,但我想知道是否有一些更有弹性和干净的方法来做到这一点。
答案 0 :(得分:6)
对接空间与表单上对象的顺序相关,如im_a_noob所述。您可以更改对象z顺序以更改它们停靠的方式。您应该能够右键单击需要填充中间空间的面板,然后从菜单中选择“Bring to Front”。这应该使它正确地填充空间和整个形式在其他面板后面。
因此,您可以将顶部面板对接到顶部,底部面板到底部,然后将中间一个对接到“填充”。然后右键单击并将中心位于前面。
答案 1 :(得分:4)
这是因为文件大纲。
转到
View -> Other Windows -> Document Outline (or ctrl + w, u)
确保您的底座填充面板(中间一个)是该列表中3个面板中的第一个。这应该可以解决你的问题。
答案 2 :(得分:2)
看起来像tableLayoutPanel会是一个不错的选择。这样你就可以为第1行(第1组)和第3行(第3组)设置绝对值,然后在中间行(第2组)使用100%,保证它占用剩余空间而不与其他空间重叠面板。
然后,一旦将datagridview放入tableLayoutPanel的中间行,您就应该能够将Dock属性设置为fill,它应该可以正常工作。
TableLayoutPanels只允许将一个元素放置在单元格中,但是您可以通过添加面板作为主要元素来解决此问题,然后配置该面板中的所有内容。
答案 3 :(得分:0)
只需将panel1锚点设置为顶部,左侧,右侧;面板2锚固件为顶部,底部,左侧,右侧;面板3锚定底部,左侧,右侧。这将确保顶部面板保持在原位,底部随窗口向下移动,中间将在两者之间扩展。
答案 4 :(得分:0)
首先,停靠面板1和3(面板1到顶部,面板3到底部):
设置完这两个后,选择Panel 2并将其设置为Fill:
<强>更新强>
以下是我在代码中验证面板顺序正确的快速代码:
public partial class PanelForm : Form {
public PanelForm() {
InitializeComponent();
int iHead = Controls.GetChildIndex(panelHead);
int iData = Controls.GetChildIndex(panelData);
int iFoot = Controls.GetChildIndex(panelFoot);
if ((iHead < iData) || (iFoot < iData)) {
panelHead.Dock = DockStyle.None;
panelData.Dock = DockStyle.None;
panelFoot.Dock = DockStyle.None;
Controls.SetChildIndex(panelData, 0);
Controls.SetChildIndex(panelHead, 1);
Controls.SetChildIndex(panelFoot, 2);
panelData.Dock = DockStyle.Fill;
panelHead.Dock = DockStyle.Top;
panelFoot.Dock = DockStyle.Bottom;
}
ShowData(DateTime.Now);
}
private void ShowData(DateTime now) {
var table = new DataTable();
var c1 = table.Columns.Add("Name", typeof(string));
var c2 = table.Columns.Add("Even", typeof(bool));
var c3 = table.Columns.Add("Index", typeof(int));
var c4 = table.Columns.Add("Times 2", typeof(int));
var c5 = table.Columns.Add("Inverse", typeof(double));
var c6 = table.Columns.Add("Timespan", typeof(TimeSpan));
var c7 = table.Columns.Add("Binary Time", typeof(long));
var c8 = table.Columns.Add("Display", typeof(string));
for (int i = 0; i < 1000; i++) {
DataRow r = table.NewRow();
r[c1] = string.Format("Row {0}", i);
r[c2] = (i % 2 == 0);
r[c3] = i;
r[c4] = 2 * i;
r[c5] = (0 < i) ? 1 / (double)i : double.NaN;
r[c6] = DateTime.Now - now;
r[c7] = DateTime.Now.ToBinary();
r[c8] = string.Format("{0:g}", DateTime.Now);
table.Rows.Add(r);
}
dataGridView1.DataSource = table;
}
}