Динамически созданные пользовательские элементы управления в C # - PullRequest
2 голосов
/ 23 февраля 2009

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

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

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

      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 ]

9 голосов
/ 23 февраля 2009

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

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

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

тогда

Controls.ContainsKey("Something") 

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

2 голосов
/ 04 февраля 2010

Вот, пожалуйста:

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;
}
1 голос
/ 23 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...