【问题标题】:setting DockStyle.Fill for dynamic controls does not resize when i move the splitter当我移动拆分器时,为动态控件设置 DockStyle.Fill 不会调整大小
【发布时间】:2011-10-13 15:24:30
【问题描述】:

我在面板 1 上有一个拆分容器我添加了一个组框,在该组框中是一个具有动态数量的文本框的流控件,我已将组框和流控件都设置为 dockstyle 来填充。 在代码中,我还将文本框设置为要填充的停靠样式,但当我移动拆分器时它们不会调整大小,而父流控制会调整大小。

        Label labelInput = new Label();

        TextBox listBoxNewInput = new TextBox();


        listBoxNewInput.Name = ce.ToString();

        labelInput.AutoSize = true;
        labelInput.Font = new Font(labelInput.Font, FontStyle.Bold);



        listBoxNewInput.Multiline = true;
        // Add vertical scroll bars to the TextBox control.
        listBoxNewInput.ScrollBars = ScrollBars.Vertical;
        // Allow the RETURN key in the TextBox control.
        listBoxNewInput.AcceptsReturn = true;
        // Allow the TAB key to be entered in the TextBox control.
        listBoxNewInput.AcceptsTab = true;
        // Set WordWrap to true to allow text to wrap to the next line.
        listBoxNewInput.WordWrap = true;
        listBoxNewInput.Text = ts.ToString();
        //listBoxNewInput.Width = 150;
        listBoxNewInput.MinimumSize = new Size(200,150);
        listBoxNewInput.MaximumSize = new Size(1000, 150);

        listBoxNewInput.Dock = DockStyle.Fill;

        listBoxNewInput.TextChanged += new EventHandler(listBoxNewInput_TextChanged);
        //Add the newly created text box to the list of input text boxes
        inputTextBoxesList.Add(listBoxNewInput);

        //Add the labels and text box to the form

        flowLayoutPanel1.Controls.Add(labelInput);
        flowLayoutPanel1.Controls.Add(listBoxNewInput);

如果我尝试将控件直接放入拆分器面板 1,则只会出现前两个控件,当我移动拆分器时它们会调整大小

splitContainer1.Panel1.Controls.Add(labelInput); splitContainer1.Panel1.Controls.Add(listBoxNewInput);

->如果当我将控件放入流控制时调整大小,当我移动拆分器时会很好 ->当我将它们直接放入拆分器面板1时,所有控件都会出现

【问题讨论】:

  • 如果 FlowLayoutPanel 里面的控件是 DockFilled,那它的意义何在?如果要 DockFill,MaximumSize 有什么意义?
  • 我不确定,但我认为 flowlayoutpanel 在 Dock.Fill 方面的表现与其他人不同。看看msdn.microsoft.com/en-us/library/ms171633.aspx ...你也可以考虑一次tablelayoutpanel。它也可以解决您的问题,但实际上保证仍然满足您的要求。
  • 如果我尝试将控件直接放入拆分器面板 1 中,只会出现两个控件:
  • splitContainer1.Panel1.Controls.Add(labelInput); splitContainer1.Panel1.Controls.Add(listBoxNewInput);
  • @LarsTech 码头填充时的最大尺寸点是仅在高度保持不变的情况下增加宽度。

标签: c# .net winforms dock dynamic-controls


【解决方案1】:

根据您的 cmets 以及我认为您要完成的工作,我认为您需要将 FlowLayoutPanel 替换为 TableLayoutPanel,因为听起来您只是将一个 TextBox 堆叠在另一个下方。

创建一个 1 列 1 行的 TableLayoutPanel。

这是一个工作示例:

tableLayoutPanel1.AutoScroll = true;
tableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows;
tableLayoutPanel1.RowStyles.Clear();
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 150));
for (int i = 0; i < 4; i++) {
  AddTextBox("TextBox #" + i.ToString());
}

private void AddTextBox(string info) {
  TextBox tx = new TextBox();
  tx.Multiline = true;
  tx.Text = info;
  tx.ScrollBars = ScrollBars.Vertical;
  tx.WordWrap = true;
  tx.Height = 150;
  tx.Anchor  = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
  tableLayoutPanel1.Controls.Add(tx);
}

我没有停靠,而是设置了 TextBox 的高度,然后设置了 Anchors,这样当 SplitPanel 调整大小时,TextBoxes 会相应地调整大小。

【讨论】:

  • 去掉这一行代码就可以工作了:tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 150));此行导致 b/t 1st 2 控件不需要空间。
  • @jaminator 是的,TableLayoutPanel 和 FlowLayoutPanel 控件并不是最好玩的。
  • 在最后添加一个额外的虚拟行以避免表格布局在最后一行之前创建不需要的空间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多