Как использовать событие Form.Load по сравнению с его методом конструктора? - PullRequest
8 голосов
/ 08 июля 2010

При инициализации свойств элементов управления или других значений, связанных с формой, я склонен переключаться назад и вперед между инициализацией значений в конструкторе формы и затем, когда вызывается событие Form.Load.

Как обычно используется конструктор Forms по сравнению с его событием Form.Load?С другими классами я бы сделал всю инициализацию в конструкторе.Тем не менее, в VS при двойном щелчке по форме он переходит к обработчику событий для события Form.Load, а не к конструктору.Это наводит меня на мысль, что предпочтительно выполнять всю инициализацию после события Load, а не конструктор.

Ответы [ 3 ]

8 голосов
/ 08 июля 2010

Да, очень грустно, что так работает. Это имело большой смысл в то время, уже 10 лет назад. Предполагалось, что Windows Forms станет заменой VB6, доминирующего дизайнера пользовательского интерфейса «укажи и щелкни» в то время. И Form_Load был важным в VB6, вот где вы настраивали представление формы.

Это было не совсем уместно с самого начала, у класса Form есть истинно чистокровный конструктор. И вы можете установить свойства элемента управления в конструкторе до того, как будет создан фактический собственный элемент управления Window. В WF куча кода, чтобы заставить это работать. Код, на который опирается дизайнер, устанавливает эти свойства до события Load. Это очень эффективно, так как многие элементы управления становятся медленнее lot , когда их нужно обновить после создания окна. Как ListView и TreeView.

Есть несколько причин не использовать конструктор самостоятельно, как это делает дизайнер, тем более что IDE C # не пытается скрыть конструктор. Кроме одного: вам нужно событие Load, когда вы пишете код, требующий знания фактического размера формы. Этот размер неизвестен до тех пор, пока окно фактически не будет создано, событие Load является самым ранним после этого. Это должно быть редкостью.

И, конечно, если вы do хотите использовать Load, вы переопределяете OnLoad вместо использования события Load. Это будет еще один.

2 голосов
/ 08 июля 2010

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

Событие формы Load обычно происходит после создания всех элементов управления. Конструктор происходит заранее. В зависимости от логики, которую вы реализуете, может быть полезно обрабатывать определенные операции в одном или другом методе. Например, инициализация многих значений лучше выполнить в конструкторе: если значения влияют на макет или содержимое формы, вы можете обнаружить, что вы создаете «потерянную» иерархию элементов управления, которая перестраивается при изменении значений. Размещение инициализации в конструкторе может позволить правильной сборке формы в первый раз, что является более производительным и может избежать некоторых ошибок.

В конечном итоге оба эти метода имеют свое применение - посмотрите, что делает ваш код, и выберите тот, который подходит.

1 голос
/ 08 июля 2010

Я всегда использую конструктор и почти никогда не использую событие form.Load, если не могу обойтись без него. Причина в том, что конструктор может получать параметры, когда событие Load на самом деле не может.

Это намного полезнее

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