.NET: Как узнать, когда сериализация завершена? - PullRequest
0 голосов
/ 28 октября 2008

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

После завершения сериализации мне нужно очистить все и заново инициализировать строки и столбцы. Есть ли защищенный метод, который я могу переопределить, чтобы знать, когда завершается сериализация элемента управления?

Конечно, я бы предпочел не выполнять работу в конструкторе, выбрасывать ее и делать снова после (потенциальной) сериализации. Есть ли предпочтительное событие, которое эквивалентно «настроить себя сейчас», чтобы оно вызывалось один раз, независимо от того, сериализован я или нет?


Сериализация, о которой я говорю, происходит от метода InitializeComponent () в файле с выделенным кодом формы.

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
   ...
}

Было бы идеально, если бы InitializeComponent был виртуальным методом, определенным Control, тогда я мог бы просто переопределить его и затем выполнить мою обработку после того, как я вызову base:

protected override void InitializeComponent()
{
    base.InitializeComponent();

    InitializeMe();
}

Но это не метод предков, он объявлен только в файле с выделенным кодом.

я заметил, что InitializeComponent вызывает SuspendLayout и ResumeLayout для различных элементов управления. я думал, что это может переопределить ResumeLayout и выполнить мою инициализацию тогда:

public override void ResumeLayout()
{
   base.ResumeLayout();

   InitializeMe();
}

Но ResumeLayout не является виртуальным, так что его нет.

Больше идей? я не могу быть первым, кто создаст пользовательский элемент управления.

Ответы [ 2 ]

1 голос
/ 30 октября 2008

Что, кажется, происходит, это:

  1. Вы разработали собственную DataGrid, которая добавляет свои собственные строки и столбцы в конструктор
  2. Вы добавили свою собственную таблицу данных в форму
  3. Вы обнаружили, что дизайнер формы написал код внутри InitializeComponent формы, который добавляет эти строки и столбцы во второй раз

Способ работы генератора кода конструктора Windows Forms заключается в том, что он просматривает все свойства вашего объекта, определяет, какими должны быть значения по умолчанию, и генерирует код для свойств, для которых не заданы значения по умолчанию. К сожалению для вас, состояние DataGrid по умолчанию не имеет строк и столбцов.

Однако вы можете изменить это поведение с помощью набора атрибутов. Простым способом может быть добавление новых копий свойств Rows и Columns в ваш класс, которые просто возвращают base.Rows и base.Columns. Добавление повторяющихся свойств таким способом позволяет применить к ним атрибут DesignerSerializationVisibilty , который можно использовать, чтобы заставить конструктор форм игнорировать предварительно заполненные строки и столбцы.

0 голосов
/ 06 июня 2010

«Есть ли защищенный метод, который я могу переопределить, чтобы знать, когда управление завершается сериализацией?»

Нет, не защищенный метод, но есть интерфейс. Если ваш элемент управления реализует ISupportInitialize , то когда Visual Studio в следующий раз сохранит файл .designer.cs формы / UserControl, который содержит ваш пользовательский элемент управления, он автоматически добавит вызов в ваш метод BeginInit сразу после создания экземпляра вашего элемента управления (но до того, как будут назначены какие-либо значения свойств), и после установки всех свойств вызывается EndInit .

Однако, несмотря на то, что это дает вам большую гибкость, довольно сложно получить право на то, что вы описываете (я использовал это для почти одного и того же, так что я знаю). Если ваш потомок получает полный контроль над строками и столбцами, и для пользователя никогда не имеет смысла редактировать их в конструкторе, тогда предложение Тима (DesignerSerializationVisibility) будет намного проще и проще для правильного понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...