2010-10-25 5 views
2

В приложении winforms у меня есть форма настроек. Форма имеет элемент управления treview и панель управления. В зависимости от выбора пользователей в древовидной структуре я хочу загрузить/добавить usercontrol в панель управления. Когда я должен создавать/инициировать пользовательские элементы управления? На обработчике события загрузки формы или после выбора узла дерева? И должен ли я избавляться от пользовательских контролей в обработчике событий закрытия?Когда я запускаю и удаляю свои UserControls?

Это мой код:

public partial class Options : Form 
{ 
    //usercontrols 
    Connections _connections; 
    Notifications _notifications; 
    Proxy _proxy; 

    private void Options_Load(object sender, EventArgs e) 
    { 
     treeViewOptions.ExpandAll(); 

     _connections = new Connections(); 
     _notifications = new Notifications(); 
     _proxy = new Proxy(); 
    } 

    private void treeViewOptions_AfterSelect(object sender, TreeViewEventArgs e) 
    { 
     switch (treeViewOptions.SelectedNode.Name) 
     { 

      case "NodeConnection": 
       ControlPanel.Controls.Clear(); 
       ControlPanel.Controls.Add(_connections); 
       break; 
      case "NodeNotifications": 
       ControlPanel.Controls.Clear(); 
       ControlPanel.Controls.Add(_notifications); 
       break; 
      case "NodeProxy": 
       ControlPanel.Controls.Clear(); 
       ControlPanel.Controls.Add(_proxy); 
       break; 
     } 
    } 
} 

Благодаря

ответ

1

Да, вы должны это исправить. Прямо сейчас вы протекаете экземпляры пользовательских элементов управления, они не будут автоматически удаляться. Кроме того, их финализатор не заботится о работе. Через некоторое время ваша программа выйдет из строя, когда она уничтожит 10 000 оконных дескрипторов.

Сделать это выглядит примерно так:

private void treeViewOptions_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    foreach (Control ctl in ControlPanel.Controls) ctl.Dispose(); 
    ControlPanel.Controls.Clear(); 

    switch (treeViewOptions.SelectedNode.Name) 
    { 

     case "NodeConnection": 
      ControlPanel.Controls.Add(_connections); 
      break; 
     case "NodeNotifications": 
      ControlPanel.Controls.Add(_notifications); 
      break; 
     case "NodeProxy": 
      ControlPanel.Controls.Add(_proxy); 
      break; 
    } 
} 
+0

Ok спасибо. Я создаю элементы управления в нужное время? Правильно ли создавать все элементы управления во время загрузки формы или я должен создавать их в своих избранных случаях? – Sam

+0

Не было бы лучше избавиться от элементов управления в обработчике события закрытия формы? Поскольку элементы управления создаются в обработчике событий загрузки формы, это означает, что один и тот же элемент управления можно использовать, если пользователь переключается между узлами treview. С вашим решением я должен был бы создать новый экземпляр usercontrol каждый раз, когда пользователь выбрал новый узел treeview, который, несомненно, будет менее результативным? – Sam

+0

При создании их на лету вы используете немного меньше системных ресурсов. Перф не должен быть заметно затронут. Стоимость находится в контрольной картине, создание дешево. Одна из особенностей поддержания их жизни и переключения между ними с помощью Hide/Show заключается в том, что все, что было введено в элементах управления, остается неизменным. Может быть желательно, не может, это зависит. –

1

Решение:

public partial class Options : Form 
{ 
    //usercontrols 
    Connections _connections; 
    Notifications _notifications; 
    Proxy _proxy; 

private void Options_Load(object sender, EventArgs e) 
{ 
    treeViewOptions.ExpandAll(); 

    _connections = new Connections(); 
    _notifications = new Notifications(); 
    _proxy = new Proxy(); 
} 

private void treeViewOptions_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    ControlPanel.Controls.Clear(); 

    switch (treeViewOptions.SelectedNode.Name) 
    { 

     case "NodeConnection": 

      ControlPanel.Controls.Add(_connections); 
      break; 
     case "NodeNotifications": 

      ControlPanel.Controls.Add(_notifications); 
      break; 
     case "NodeProxy": 

      ControlPanel.Controls.Add(_proxy); 
      break; 
    } 
} 

    private void Options_FormClosing(object sender, FormClosingEventArgs e) 
    { 

     _connections.Dispose();   
     _notifications.Dispose(); 
     _proxy.Dispose(); 

    } 

}

Смежные вопросы