Добавление / закрепление элементов управления в UserControl C# .NET

Я пишу 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 ответа

Решение

При использовании Winforms только последовательность, в которой добавлены элементы управления, определяет их поведение при стыковке.

Последний добавленный элемент управления всегда будет находиться ближе всего к границе стыковки, т.е. DockStyle.Top, ни BringToFront ни SendToBack или порядок табуляции изменит это.

Просто добавьте элементы управления в обратном порядке или удалите их и добавьте их снова.

Вот мое решение этого. По сути, вы помещаете элементы управления в список, а также в контейнер. Затем вы используете 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();
    }

Я знаю, что это лет, но какого черта.

Вы можете использовать метод 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

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 и в зависимости от этого устанавливаете местоположение нового элемента.

Другие вопросы по тегам