【问题标题】:three panels layout on form [closed]表单上的三个面板布局[关闭]
【发布时间】:2013-06-12 19:44:37
【问题描述】:

我正在尝试构建一个表单布局,它将满足以下要求:

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

我的问题是让面板 2 填充面板 1 和面板 3 之后留下的整个位置。所以如果 panel1 和 panel3 的高度都是固定的 100,而 form 的高度是 500,那么 panel2 的高度应该是 300,如果 form 将调整为 600,那么 panel2 也应该调整为 400,等等。

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

【问题讨论】:

  • 你得到了什么结果?
  • panel1=DockTop、Panel3=DockBottom 和 Panel2=Fill 有什么问题?
  • 是winforms还是wpf app?
  • @Chepene PanelsDocks 说它的 WinForms。否则他会处理gridsalignments
  • 谁投票结束了这个,为什么?这是很酷的东西。

标签: c# winforms visual-studio-2010


【解决方案1】:

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

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

【讨论】:

  • 这对我来说非常有效,我从那个开始,没有尝试通过锚定来解决它,所以我不知道它是否也有效。非常感谢!
【解决方案2】:

这是因为文档大纲。

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        首先,停靠面板 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;
          }
        
        }
        

        【讨论】:

        • 这还不够。如果面板的 z 顺序不正确,您将无法获得预期的结果。请参阅 im_a_noob 和我的答案以了解如何解决此问题。
        • 所以,我写了一段代码来验证面板的顺序是否正确(见更新)。
        • 既然可以通过设计器修复它,为什么还要在代码中呢?
        • 您可能无法始终访问设计器。此外,在团队环境中,某些团队成员可能会胡闹您的表单。如果它在代码中设置,它仍然可以工作。最后,如果有人不理解所写的解释,代码可以跨越语言障碍进行解释。
        猜你喜欢
        • 1970-01-01
        • 2013-12-28
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多