2011-10-04 30 views
4

我有一個表格,它包含一個帶有1列和3行的TableLayout,其中包含2個FlowLayoutPanels和一個文本框。 所有行都是AutoSize,列設置爲百分比= 100%。FlowLayoutPanel使用AutoSize時的高度錯誤

每個FlowLayoutPanel都包含多個文本框。 FlowLayoutPanels設置爲:LeftToRight,AutoSize = true,GrowAndShrink,停靠=填充。

輪廓是:

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) 

的問題是,如果我放置FlowLayoutPanel的,其也設定爲自動調整大小=真,則FlowLayoutPanel的高度設置不正確一個分組框中內,它顯示了在1文本框從表單中刪除一些文本框。

要點是:

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的,而不是同樣的事情發生。

順便說一下,即使沒有TableLayout也會發生這種情況。我嘗試將GroupBox(使用FlowLayoutPanel)放置在AutoSized窗體上,並獲得相同的行爲。

我認爲問題是,當FlowLayoutPanel在另一個也是AutoSized的容器時,它無法傳遞給它的容器是首選大小。

可以做些什麼來重寫這個bug?

請幫助 感謝, 約拉姆


P.S:我必須使用分組框有大約文本框一個很好的框架。

回答

2

也遇到過這個問題,並試圖找出如何輕鬆解決這個問題。 雖然@ GertArnold的回答確實幫助,感覺有點麻煩,我搜索了另一種解決方案。

我發現的是,Flow Panel的自動調整邏輯正在處理'最低'要求,並且通過添加一個空白麪板,最小高度,我能夠強制流動面板的寬度,從而使所有其他子控件可見。

所以在上面的最終佈局的例子是:

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) 

希望這有助於。

2

當您將FlowLayoutPanel停靠在GroupBox(或其他容器)中時,您最好不要離開它們的AutoSize=false。我不確定,但是這可能會使羣組成爲大小調整時的「領先」控制。


編輯(您的評論之後)

「領先的控制」是我的語言試圖表達的是組框的大小將決定FLP的是,它不是某些爲官一任。問題是對接和自動調整是fighting one another by nature,有人應該很好地控制。只有在停靠和自動調整縮減以及自己編寫調整大小事件時才能完成此操作。

張望了一下打後,我終於想出了這種模式:

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

而且resize事件:

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

我希望我理解你。至少這可能會讓你指向正確的方向。

+0

我不能使用自動調整大小=虛假的FlowLayuotPanel因爲當表單被用戶streched,組框被拉伸和FlowLayoutPanel的拉伸它,而且它可以容納所有它控制在一個行我希望它將AutoSize設置爲一行,從而減小GroupBox高度。 – Yoram

+0

順便說一句:你可以在這裏發佈一個鏈接,解釋你對什麼是「主導」控制關於尺寸? 這可以導致解決這個問題,因爲我不知道'領先'控制.. 謝謝 – Yoram

+0

我真的很感激你的回覆 因爲我搬到了不同的任務,所以我得在幾天後回到這裏 我會回來的,當我可以檢查你的解決方案時 Thanks !! – Yoram