Динамически создаваемые пользовательские элементы управления в C#

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

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

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

      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. Он просто не отображает пользовательский элемент управления на экране во второй раз, когда я пытаюсь его загрузить.

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

Ответов (3)

Решение

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

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

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

тогда

Controls.ContainsKey("Something") 

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

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

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

Ну вот:

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;
}