8

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

  • panel1 是固定高度 - 它只包含一个标签,该标签将是某种带有标题的标题等
  • panel2 将包含带有dockstyle填充的datagridview,在这里用户将找到他可以选择以显示其属性的对象
  • panel3 是固定高度 - 它将位于表单的底部,并将包含来自 datagridview 的选定对象的属性

我的问题是让面板 2 填充面板 1 和面板 3 之后留下的整个位置。因此,如果 panel1 和 panel3 的高度都为 100,而窗体的高度为 500,则 panel2 的高度应为 300,如果将 form 调整为 600,则 panel2 也应调整为 400,以此类推。

我正在尝试一些停靠组合,试图将 panel1 停靠设置为顶部,将 panel3 设置为底部,将 panel2 设置为填充,但它给出的结果超出了预期。我知道我可以处理表单调整大小事件并将 panel2 调整为将要离开的大小,但我想知道是否有一些更灵活和更干净的方法来做到这一点。

4

5 回答 5

6

正如 im_a_noob 所提到的,停靠空间与表单上对象的顺序有关。您可以更改对象 z 顺序以更改它们的停靠方式。您应该能够右键单击需要填充中间空间的面板,然后从菜单中选择“置于前面”。这应该使它正确填充空间和其他面板后面的整个表格。

因此,您可以将顶部面板停靠在顶部,底部面板停靠在底部,然后将中间的面板停靠在“填充”上。然后右键单击并将中间的一个放在前面。

于 2013-06-12T19:56:59.437 回答
5

这是因为文档大纲。

View -> Other Windows -> Document Outline (or ctrl + w, u)

确保您的码头填充面板(中间一个)是该列表中 3 个面板中的第一个。这应该可以解决您的问题。

于 2013-06-12T19:50:03.633 回答
2

似乎 tableLayoutPanel 在这里是一个不错的选择。这样,您就可以为第 1 行(面板 1)和第 3 行(面板 3)设置绝对值,然后将 100% 用于中间行(面板 2),以保证它将占用剩余空间而不会与其他空间重叠面板。

然后,一旦您将 datagridview 放入 tableLayoutPanel 的中间行,您应该能够将 Dock 属性设置为填充并且它应该可以正常工作。

TableLayoutPanels 只允许将一个元素放置在单元格中,但是您可以通过添加一个面板作为主要元素然后在该面板中配置所有内容来解决此问题。

于 2013-06-12T20:22:42.563 回答
0

只需将 panel1 锚点设置为上、左、右;面板 2 锚定为顶部、底部、左侧、右侧;面板 3 锚定底部、左侧、右侧。这将确保顶部面板保持在原位,底部随着窗口向下移动,中间将在两者之间展开。

于 2013-06-12T19:57:28.180 回答
0

首先,停靠面板 1 和 3(面板 1 到顶部,面板 3 到底部):

最佳

设置这两个后,选择面板 2 并将其设置为填充:

充满

更新:

这是我为验证您的面板在代码中的正确顺序所做的快速代码:

截屏

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

}
于 2013-06-12T19:59:59.950 回答