2013-01-22 27 views
2

我正在編寫一個以編程方式添加子控件的UserControl。目前,我添加新的控件,像這樣:UserControl中的添加/停靠控件C#.NET

this.Controls.Add(new Control() { Height = 16, Dock = DockStyle.Top }); 

我遇到的問題是,新的控件的現有控件上面添加,所以我想要的控件進行排序1,2,3,4,5 ,從上到下依次爲6,從上到下依次爲6,5,4,3,2,1。

我想知道如何確保在所有現有控件(按照顯示順序)之後添加新控件。

還有,我想知道,如果我可以插入其他兩個選定控件

我已經嘗試設置的TabIndex但這並沒有幫助之間的控制!

+1

你試過SendToBack \ BringToFront? 哪個控件添加了? – Guy

+0

@Guy ...不...但我會試試這個! – series0ne

回答

3

使用Winforms時,只有添加控件的順序決定了它們的對接行爲。

最後一次添加的控件將總是最靠近對接邊框,即與DockStyle.Top一起頂部。 BringToFrontSendToBack或Tab-order都不會改變這一點。

只需以相反的順序添加控件,或刪除它們並再次添加它們。

+1

奇怪的是,當我使用BringToFront時,我的面板會改變順序。我想我的VS2010是神奇的:D – WozzeC

+0

不,我剛剛檢查了你的解決方案,它適用於我。所以我被證明是錯誤的。我很確定它不會工作,因爲我花了幾個小時幾乎有同樣的問題。 –

+0

在VS 2013社區Edition.Thanks工作。 –

0
private Int32 m_OffsetY = 0; 
private Int32 m_MarginY = 10; 

private void AddControl(Control control) 
{ 
    SuspendLayout(); 
    Controls.Add(control); 
    control.Location = new Point(m_OffsetX, m_OffsetY); 
    ResumeLayout(); 

    m_OffsetY += control.Height + m_MarginY; 
} 

// ... 

控制插入的問題......控制位置取決於它們添加到窗體的順序是不可能的。但是,如果您有佈局空間,則可以在兩個控件之間物理插入一個控件...您可以計算ctrl1和ctrl2的位置和尺寸,並根據此設置新的位置和尺寸。

+0

我不希望控件停靠在底部,我希望它們停靠在父控件的頂部,但按照它們生成的順序。目前最後生成的控件始終位於頂部,高於以前生成的控件 – series0ne

+0

因此...取最後一個添加的控件的偏移量,然後根據該偏移量設置全新添加的控件的位置。例如...偏移= 0 - >添加控制 - >偏移= 16 - >添加控制和下移16 - >偏移= 32 - >添加控制和下移32 ... –

+0

我編輯了我的答案。 –

1

這是我的解決方案。基本上你把控件放在一個列表以及容器中。然後你使用Bring to Front,前面提到的幾乎是所有的帖子。這當然也給你插入的可能性。

Panel control1 = new Panel() { Height = 16, Dock = DockStyle.Top, BackColor = Color.Red}; 
    this.Controls.Add(control1); 
    Panel control2 = new Panel() { Height = 16, Dock = DockStyle.Top, BackColor = Color.White }; 
    this.Controls.Add(control2); 
    Panel control3 = new Panel() { Height = 16, Dock = DockStyle.Top, BackColor = Color.Black }; 
    this.Controls.Add(control3); 
    Panel control4 = new Panel() { Height = 16, Dock = DockStyle.Top, BackColor = Color.Yellow }; 
    this.Controls.Add(control4); 
    Panel control5 = new Panel() { Height = 16, Dock = DockStyle.Top, BackColor = Color.Blue }; 
    this.Controls.Add(control5); 
    Panel control6 = new Panel() { Height = 16, Dock = DockStyle.Top, BackColor = Color.Green }; 
    this.Controls.Add(control6); 
    PanelList.Clear(); 
    PanelList.Add(control1); 
    PanelList.Add(control2); 
    PanelList.Add(control3); 
    PanelList.Add(control4); 
    PanelList.Add(control5); 
    PanelList.Add(control6); 
    Panel control7 = new Panel() { Height = 16, Dock = DockStyle.Top, BackColor = Color.Pink }; 
    this.Controls.Add(control7); 
    PanelList.Insert(3, control7); 
    for (int i = 0; i < PanelList.Count; i++) 
    { 
     PanelList[i].BringToFront(); 
    }