2009-02-23 3 views
2

Я работаю в проекте winforms C#, и у меня есть пользовательский элемент управления, который загружается при его выборе из меню инструментальной полосы. У меня есть набор поиска словаря, который возникает при загрузке формы пользовательского элемента управления для других функций. Кроме того, когда я закрываю пользовательский элемент управления, я просто использую «.Hide();» метод. Я заметил, что когда я загружаю пользовательский элемент управления в первый раз, все в порядке, но когда я его закрываю и выбираю, чтобы открыть его снова, второй раз он создает новый экземпляр объекта, отбрасывая мой поиск в словаре. Поэтому я написал код, чтобы исправить проблему.Динамически созданный пользовательский элемент управления в C#

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

Ниже приведен код, который я написал для этой цели, которая происходит при выборе пункта из меню инструментов полосы:

 if (Controls.ContainsKey("CheckAvailUserControl")) 
     { 
      Controls["CheckAvailUserControl"].Dock = DockStyle.Fill; 
      Controls["CheckAvailUserControl"].Visible = true; 
      Controls["CheckAvailUserControl"].Show(); 
      Controls["CheckAvailUserControl"].Refresh(); 
     } 

     else 
     { 
      UserControl checkAvailUserControlLoad = new CheckAvailUserControl(); 
      Controls.Add(checkAvailUserControlLoad); 
      checkAvailUserControlLoad.Dock = DockStyle.Fill; 
      checkAvailUserControlLoad.Visible = true; 
      checkAvailUserControlLoad.Show(); 
     } 

Когда я проследить через мой код в отладчике он является на самом деле попав в правильные части вышеприведенного оператора if/else. Его просто не отображает пользовательский элемент управления на экране во второй раз, когда я пытаюсь его загрузить.

Вопрос: Как я могу получить правильное управление пользователем после его закрытия, а затем снова выбрать его из меню инструментальной полосы?

+0

Какой вопрос? –

+0

Вопрос: Как я могу правильно настроить пользовательский элемент управления после его закрытия, а затем снова выбрать его из меню инструментальной полосы? –

ответ

9

Я думаю, что Controls.ContainsKey (...) всегда возвращает false, потому что вы никогда не назначали имя своему управлению, когда вы его создали.

Если при создании элемента управления, вы говорите

//... 
checkAvailUserControlLoad.Name = "Something" 
//... 
Controls.Add(checkAvailUserControlLoad); 

затем

Controls.ContainsKey("Something") 

возвращает истину, и вы будете иметь возможность повторно использовать элемент управления с помощью Controls["Something"]

+0

Да, если код, задающий свойство Name, не указан. –

+0

@Henk: Разве это не все мое сообщение, что вам нужно установить свойство Name? –

1

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

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

2

Здесь вы идете:

private void button_Click(object sender, EventArgs e) 
{ 
    // pass in the containing panel 
    LoadControl<MyControls.MyControl>(panelContainer); 
} 

void LoadControl<T>(Panel panel) where T : Control, new() 
{ 
    T _Control = GetControl<T>(panel); 
    if (_Control == null) 
    { 
     _Control = new T(); 
     _Control.Dock = DockStyle.Fill; 
     panel.Controls.Add(_Control); 
    } 
    _Control.BringToFront(); 
} 

T GetControl<T>(Panel panel) where T : Control 
{ 
    Type _Type = typeof(T); 
    String _Name = _Type.ToString(); 
    if (!panel.Controls.ContainsKey(_Name)) 
     return null; 
    T _Control = panel.Controls[_Name] as T; 
    return _Control; 
}