Пристыковка инкапсулированного элемента управления

У меня есть инкапсулированный элемент управления в производном TabPage, и у меня возникают проблемы с его стыковкой с формой MainForm, содержащей производный TabPage.

Я правильно добавил TabPage и элемент управления, и они отображаются на MainForm. Однако элемент управления закреплен неправильно (стиль: заливка). Вы можете убедиться в этом, изменив размер формы.

Я установил свойства _control.Dock = System.Windows.Forms.DockStyle.Fill и _control.Anchor = Left | Right | Top | Bottom в производном конструкторе TabPage.

Ниже приведен образец кода:

public class DerivedTab : TabPage {
    public DerivedTab(){
        ...
        _control= new BrightIdeasSoftware.TreeListView();
        this.Controls.Add(this._control);
        _control.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right | System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom;
        _control.Dock = System.Windows.Forms.DockStyle.Fill;
        ...
    }
}

В MainForm это функция, которая создает производную вкладку во время выполнения:

    private DerivedTab CreateTab(string name)
    {
        DerivedTab tab = new DerivedTab(this, name);
        tab.SuspendLayout();

        MainTab.Controls.Add(tab);
        return tab;
    }

В любом случае, я сгенерировал этот код с помощью Visual Studio Designer, и элемент управления закрепился правильно. Затем я создал класс для страницы вкладок (так как мне понадобится много и различное количество этих вкладок) и скопировал все, что относится к странице вкладок, в функцию CreateTab. Я переместил все, что связано со свойством вкладки, в ее конструктор. Я инкапсулировал элемент управления в производную TabPage и переместил все, что связано с элементом управления, на производную вкладку.

Итак, что мне не хватает? Можно ли закрепить инкапсулированный элемент управления без реализации функции обработчика событий?


person swtdrgn    schedule 30.10.2012    source источник


Ответы (1)


Я нашел решение своей проблемы. ResumeLayout должен быть вызван после того, как TabControl добавит TabPage, чтобы TabPage правильно закрепил.

private DerivedTab CreateTab(string name)
{
    DerivedTab tab = new DerivedTab(this, name);
    tab.SuspendLayout();

    MainTab.Controls.Add(tab);
    tab.ResumeLayout();
    return tab;
}
person swtdrgn    schedule 06.01.2013