表格上的三个面板布局

时间:2013-06-12 19:44:38

标签: c# winforms visual-studio-2010

http://i.stack.imgur.com/SewpO.png 我正在尝试构建一个表单布局,它将满足以下要求:

  • panel1是固定高度 - 它只包含一个带标题的标签,等等。
  • panel2将包含带有dockstyle fill的datagridview,此处用户将找到可以选择显示其属性的对象
  • panel3是固定高度 - 它将位于表单的底部,并将包含datagridview中所选对象的属性

我的问题是让panel2填充在panel1和panel3之后留下的整个地方。因此,如果panel1和panel3都具有固定高度100,并且窗体具有高度500,那么panel2应该具有300高度,如果窗体将被调整为600,则panel2也应该调整为400等等。

我正在尝试一些底座组合,尝试将panel1 dock设置为top,panel3设置为bottom,panel2设置为fill,但它提供的结果超出预期。我知道我可以处理窗体调整大小事件并将panel2调整到一个可以保留的大小,但我想知道是否有一些更有弹性和干净的方法来做到这一点。

5 个答案:

答案 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到底部):

top

设置完这两个后,选择Panel 2并将其设置为Fill:

fill

<强>更新

以下是我在代码中验证面板顺序正确的快速代码:

screenshot

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

}