2009-06-09 4 views
8

При добавлении элементов управления в форме во время выполнения, вы можете сделать одно из следующих действий:Лучшая практика для добавления элементов управления во время выполнения

Button btn = new Button(); 
//... 
this.Controls.Add(btn); 

или

Button x = new Button(); 
//... 
btn.Parent = this; 

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

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

Кто-нибудь знает ответ или может указать мне в правильном направлении?

+0

Возможно, вы имеете в виду это.Controls.Add ... –

+0

Ваше право, исправлено. – Pondidum

+0

Дубликат: http://stackoverflow.com/questions/961554/difference-between-setting-control-parent-property-and-using-controls-add – RSolberg

ответ

12

Поскольку спекуляция является пустой тратой времени, я схватил свою копию Reflector и посмотрел на фактический код. Свойство Родитель вызывает ParentInternal свойство, которое, в свою очередь, вызывает value.Controls.Add (этот)

/* this code is part of the .NET Framework was decompiled by Reflector and is copyright Microsoft */ 
    internal virtual Control ParentInternal 
    { 
     get 
     { 
      return this.parent; 
     } 
     set 
     { 
      if (this.parent != value) 
      { 
       if (value != null) 
       { 
        value.Controls.Add(this); 
       } 
       else 
       { 
        this.parent.Controls.Remove(this); 
       } 
      } 
     } 
    } 

На основании этого кода, методы эквивалентны и это строго зависит от предпочтений.

+0

oh. Ты подтолкнул меня на это! никто не должен быть без отражателя. – PeterAllenWebb

+3

В целях поддержки .Parent гораздо труднее читать и интерпретировать, чем .ControlsAdd(); – RSolberg

+0

@RSolberg - Я не согласен с тем, что Controls.Add более явственно, но это не вопрос. Возникает вопрос, будут ли проблемы с Dispose с использованием шаблона .Parent. На основе фактического кода их не будет. –

3

Я всегда предпочитал идентификацию элементов управления, которые объект я собираюсь добавить новый элемент управления для ...

Button btn = new Button(); 
this.PlaceHolder1.Controls.Add(btn); 

Button btn2 = new Button(); 
this.PlaceHolder2.Controls.Add(btn2); 

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

Я считаю, что использование .Parent-кода внутри делает .Controls.Add, поэтому они должны иметь тот же конечный результат, но для меня это сводится к читаемости кода.

Существует аналогичный вопрос здесь, на StackOverflow.

-1

Мне лично нравится

Button btn = new Button(); 
//... 
this.Controls.Add(btn); 

Потому что, это более четко и читаемый код.

3

Я вижу, где проблема с кнопкой может быть проблемой, если вы пишете приложение, которое открывает и закрывает множество форм в течение его продолжительности. Вам нужно убедиться, что у вас есть правильный код удаления, чтобы убедиться, что приложение не всасывает слишком много памяти.

Это в стороне, мне нравится первое утверждение, потому что оно более четко объясняет, что делает ваш код. Вы создаете новую кнопку, и вы добавляете ее к существующим элементам управления на странице. Вы можете прочитать это сразу после отладки/рефакторинга и понять, что происходит. Во второй группе кода это немного более расплывчато. Если вы почистили объявление начальной кнопки и увидели btn.Parent = это утверждение, вы могли бы поверить, что вы переназначили кнопку новой формы или что-то в этом роде.

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

1

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

Это уже было сказано, я предпочитаю

this.Controls.Add(btn); 

, потому что, как представляется, более семантически правильный для того, что вы на самом деле делаете. Я всегда использую этот метод, а не устанавливаю свойство Control.Parent.

0

Это действительно вопрос вкуса. Вот что происходит, когда вы устанавливаете свойство Parent на Control. Этот код имеет любезность .NET Reflector.

set 
{ 
    if (this.parent != value) 
    { 
     if (value != null) 
     { 
      value.Controls.Add(this); 
     } 
     else 
     { 
      this.parent.Controls.Remove(this); 
     } 
    } 
} 
Смежные вопросы