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

StackOverflow https://stackoverflow.com/questions/578954

Вопрос

Я работаю над проектом Winforms на С#, и у меня есть пользовательский элемент управления, который загружается при его выборе из меню панели инструментов.У меня есть поиск по словарю, который должен выполняться при загрузке формы пользовательского элемента управления для других функций.Кроме того, когда я закрываю пользовательский элемент управления, я просто использую «.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.Пользовательский элемент управления просто не отображается на экране во второй раз, когда я пытаюсь его загрузить.

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

Это было полезно?

Решение

Я думаю, что 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;
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top