在UserControl C#.NET中添加/停靠控件

时间:2013-01-22 10:25:56

标签: c# .net user-controls docking

我正在编写一个UserControl,它以编程方式添加子控件。目前我正在添加如下的新控件:

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

我遇到的问题是在现有控件上方添加了新控件,所以我希望控件从上到下排序为1,2,3,4,5,6,它将它们排序为6, 5,4,3,2,1从上到下。

我想知道如何确保在所有现有控件(根据显示顺序)之后添加新控件。

而且,我想知道我是否可以在另外两个选定控件之间插入一个控件

我已尝试设置TabIndex,但这没有帮助!

4 个答案:

答案 0 :(得分:3)

仅使用Winforms时,添加控件的顺序决定了它们的对接行为。

最后添加的控件将始终最接近停靠边框,即最靠近DockStyle.TopBringToFrontSendToBack或Tab-order都不会改变这一点。

只需按相反顺序添加控件,或将其删除并重新添加。

答案 1 :(得分: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();
    }

答案 2 :(得分: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的位置和尺寸,然后根据这个设置新的位置。

答案 3 :(得分:0)

我知道这已经岁了,但是到底是什么。

您可以使用SetChildIndex方法控制此项,如下所示

var someControl = new UserControl();
someControl.Dock = DockStyle.Top;
MainForm.Controls.Add(someControl);
MainForm.Controls.SetChildIndex(someControl, 0);

来源:http://tipsntricksbd.blogspot.com/2009/10/c-dynamically-adding-control-with.html