Переопределение вопросов элемента управления TableLayoutPanel в Windows (форма) - PullRequest
1 голос
/ 14 августа 2010

У меня есть класс, производный от TableLayoutPanel.Этот класс верстки корректирует табель (сетка 3х8) и добавляет несколько флажков в некоторые ячейки.Все это делается путем переопределения функции InitLayout ().

public class TableLayoutPanelHours : TableLayoutPanel
{
    protected override void InitLayout()
    {  
        RowCount = 3;
        ColumnCount = 8;

        // Set some column and row styles
        RowStyles[0].SizeType = SizeType.Percent;
        RowStyles[0].Height = (100 / RowCount);
        // ... etc ...

        // ... create checkbox with the name checkbox1
        Controls.Add(checkbox1, 1, 1);  // Put in cell 1x1
        // ... etc ...
    }
}

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

Затем, помещая элемент управления в простую форму Windowsслучаются некоторые вещи, которые я не хочу использовать: - элемент управления еще не изменен в режиме разработки.TableLayoutPanel отображает сетку по умолчанию 2x2, и флажки находятся в странном месте.После выполнения элемент управления отображается правильно (сетка 3x8 с флажком в правильных местах) - И: в InitializeComponent () формы я вижу следующие строки:

// 
// tableLayoutPanelHours1
// 
this.tableLayoutPanelHours1.ColumnCount = 8;
this.tableLayoutPanelHours1.ColumnCount = 3; 
this.tableLayoutPanelHours1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); 
// ....

Я исключил, что этистроки не отображаются в InitializeComponent () форм Windows Forms, но почему это происходит?

Спасибо.

1 Ответ

0 голосов
/ 14 августа 2010

Вы сражаетесь с дизайнером для TLP.Это пользовательский, как вы можете ясно увидеть, как он ведет себя в режиме дизайна.Использование метода InitLayout () для инициализации TLP некорректно, слишком поздно.Вместо этого вы должны сделать это в конструкторе.

Но это все равно не даст вам того, что вы хотите, дизайнер TLP жестко кодирует количество строк и столбцов, когда он инициализируется в 2x2.И он не может обработать код, изменяющий его во время разработки (как вы сделали в InitLayout), нет событий для прослушивания.Вам придется отказаться от этого дизайнера.

Все должно быть в порядке, так как вы уже инициализировали TLP так, как вы этого хотите.Используйте атрибут [Designer] для возврата к ControlDesigner.Если это сложно для вашего контроля, то вам придется создать свой собственный дизайнер.Используйте Reflector, чтобы взглянуть на внутренний класс TableLayoutPanelDesigner, чтобы начать с этого.Помните, что это не простой конструктор.

Эти присваивания свойств отображаются в InitializeComponent, поскольку атрибут [DefaultValue] в этих свойствах объявляет другое значение по умолчанию.Вы можете исправить это, добавив в свой класс частный метод ShouldSerializeRowCount (и ColumnCount).Верните false, чтобы предотвратить сериализацию свойства.

...