2011-03-25 60 views
4

嗨,我正在使用Panel來保存控件列表(用戶定義)。我添加面板的方式是,在將其添加到面板之前,我基於Panel.Controls.Count設置控件的位置。添加到具有位置的可滾動面板

comRec.Location = new Point(comRec.Location.X, panel1.Controls.Count * 25); 
panel1.Controls.Add(comRec); 

現在,這工作很好,看起來完全是我想要的方式。但是,一旦我們達到了窗口的限制,AutoScroll啓用(我確實需要)。現在,如果用戶要滾動到Panel的底部,這最終會改變面板中每個控件的位置。而不是我的第一個comRec.Location是(0,0),它是類似於(0,-219)。所以,現在,當用戶添加另一個對象時,它會在對象之間創建一個巨大的差距。

我的問題是這樣的,最好的方式是用滾動條來說明位置的變化,並且仍然使用我的添加系統。我假設必須檢查滾動條的值並使用它來確定位置。

此外,有更好的方式來顯示控件列表?我應該使用Panel嗎?

回答

5

看看FlowLayoutPanel控制,這正是你所要做的。

+0

這看起來像它的伎倆!但是,FlowDirection屬性有點令人困惑。當您打開AutoScroll時,您需要使用LeftToRight而不是TopDown作爲垂直滾動面板。 – 2011-03-25 17:27:01

+1

[TableLayoutPanel](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.tablelayoutpanel.aspx)也值得一看。 – Justin 2011-03-25 17:28:03

+0

因爲我已經有了一個usercontrol,它在內部處理所有的值,我喜歡FlowLayoutPanel更適合我的情況,但感謝替代方案。在未來的發展過程中,我會牢記這兩點。 – 2011-03-25 17:30:49

1

您可以添加一個額外的面板到層次:

Outer panel (scrollable) 
    Inner panel (not scrollable, resize it whenever you add a control) 
     User Defined Control 1 
     User Defined Control 2 
     User Defined Control 3 
     User Defined Control 4 
     ... 

這樣,你的其他控件的位置會相對於其直接父,非滾動面板。

+0

感謝您的回答,這樣做可行,但FlowLayoutPanel比使用面板更乾淨,更好。 – 2011-03-25 17:28:11

1

如果添加若干控件,嘗試暫停面板的佈局,同時添加控件:

​​

這幫助我在類似情況下,用戶可以動態改變現有控件的可見性。