5

2つのFlowLayoutPanelとテキストボックスを保持する1列と3行のTableLayoutを保持するフォームがあります。すべての行はAutoSizeであり、列はPercentage = 100%に設定されています。

各FlowLayoutPanelは、いくつかのTextBoxを保持します。FlowLayoutPanelsが設定されます:LeftToRight、AutoSize = true、GrowAndShrink、Docking=Fill。

概要は次のとおりです。

Form
    TableLayout (Dock=Fill)
        FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
           More controls
        FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
           More controls
        TextBox(Dock=Fill, MultiLine=true)

問題は、同じくAutoSize = trueに設定されているGroupBox内にFlowLayoutPanelを配置すると、FlowLayoutPanelの高さが正しく設定されず、フォームから一部のTextBoxを切り取った1行のTextBoxが表示されることです。

概要は次のとおりです。

Form
    TableLayout (Dock=Fill)
        GroupBox (Dock=Fill, AutoSize=True, GrowShrink) 
            FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
               More controls
        GroupBox (Dock=Fill, AutoSize=True, GrowShrink) 
            FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
               More controls
        TextBox(Dock=Fill, MultiLine=true)

ところで、FlowLayoutPanelを保持するためにGroupBox、Panel、またはUserControlの代わりに使用した場合も、同じことが起こります。

ところで2、これはTableLayoutがなくても発生します。GroupBox(FlowLayoutPanelを使用)をAutoSizedフォームに配置しようとしましたが、同じ動作が得られます。

私が問題だと思うのは、FlowLayoutPanelがAutoSizedされている別のコンテナーにある場合、そのコンテナーに渡すことができないということです。

このバグを無効にするために何ができるでしょうか?

ありがとう、ヨラムを助けてください


ps:TextBoxの周りに素敵なフレームを作成するには、GroupBoxを使用する必要があります。

4

3 に答える 3

2

(または他のコンテナ)にドッキングするときFlowLayoutPanelは、そのままにしておくこともできます。よくわかりませんが、これにより、サイズ設定に関してグループボックスが「主要な」コントロールになる可能性があります。GroupBoxAutoSize=false


編集(コメント後)

「リーディングコントロール」とは、グループボックスのサイズがFLPのサイズを決定することを表現しようとする私の言葉であり、正式な用語ではありません。問題は、ドッキングと自動サイズ設定が本質的に互いに戦っていて、誰かが制御する必要があるということです。これは、ドッキングと自動サイズ変更が削減され、サイズ変更イベントを自分でプログラミングすることによってのみ実行できます。

少し遊んだ後、私はついにこのモデルを思いついた:

Form
    TableLayout (Dock=Fill)
        GroupBox () 
            FlowLayoutPanel(Dock=Fill)
               More controls

そして、サイズ変更イベント:

private void Form1_Resize(object sender, EventArgs e)
{
    this.SuspendLayout();
    this.groupBox.Width = this.Width - 20;
    this.groupBox.Height = 
        this.flowLayoutPanel.GetPreferredSize(this.groupBox.Size).Height + 20;
    this.ResumeLayout();
}

私はあなたをよく理解したと思います。少なくともこれはあなたを正しい方向に向けるかもしれません。

于 2011-10-04T21:13:04.047 に答える
2

この問題にも遭遇し、これを簡単に解決する方法を見つけようとしました。@GertArnoldの回答は役に立ちましたが、少し面倒な感じがしたので、別の解決策を探しました。

私が見つけたのは、フローパネルの自動サイズ設定ロジックが「最小」要件で機能しており、最小の高さの空白のパネルを追加することで、フローパネルの幅を強制して、他のすべての子コントロールを表示できるようにしたことです。

したがって、上記の例では、最終的なレイアウトは次のようになります。

Form
    TableLayout (Dock=Fill)
        GroupBox (Dock=Fill, AutoSize=True, GrowShrink) 
            FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
                Panel(Dock=Fill, Height = 1, MinimumSize = new System.Drawing.Size( Form.ClientSize.Width - TableLayout.Padding.Horizontal, 1))
                More controls
        GroupBox (Dock=Fill, AutoSize=True, GrowShrink) 
            FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
                Panel(Dock=Fill, Height = 1, MinimumSize = new System.Drawing.Size( Form.ClientSize.Width - TableLayout.Padding.Horizontal, 1))
                More controls
        TextBox(Dock=Fill, MultiLine=true)

お役に立てれば。

于 2012-06-13T05:57:18.417 に答える
0

パーティーに遅れて申し訳ありませんが、Gert Arnoldの答えを使用すると、「単一行」に等しい値が返されるため、 FlowLayoutPanelsとその親の高さを簡単に計算する方がよいことをお勧めします。子を削除するとき-2行がまだ必要な場合でも(少なくとも私の場合)。GetPreferredSize()HeightControl

public YodaUserControl
{
  InitializeComponent();
  InitialHeight = parentOfFlp.Height;
}

private int InitialHeight { get; }

private void OnAdded(object sender, ControlEventArgs args)
  => RefreshHeight();

private void OnRemoved(object sender, ControlEventArgs args)
  => RefreshHeight();

private void OnSizeChanged(object sender, EventArgs args)
  => RefreshHeight();

private void RefreshHeight()
{
  if (flpYoda.Controls.Count > 1
      && flpYoda.Controls[0] is Control control)
  {
    parentOfFlpYoda.Height = flpYoda.Height =
      InitialHeight * (int)Math.Ceiling(
        flpYoda.Controls.Count / Math.Floor(
          flpYoda.ClientSize.Width / (double)control.Width));
  }
}

ノート:

  • もちろん、とを対応する名前に置き換える必要がYodaUserControlありparentOfFlpYodaますflpYoda
  • OnAddedOnRemoved&​​は、対応する&イベントにOnSizeChangedアタッチする必要があります。flpYodaControlAddedControlRemovedSizeChanged

さらにサポートが必要な場合は、コメントでお知らせください。

于 2019-10-08T09:31:28.450 に答える