2009-09-29 3 views
0

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

int iPanelNumber = 1; 

foreach (string[] Persons in alItems) 
{ 
    Panel pPanelContainer = new Panel(); 
    pPanelContainer.Width = contentPanel.Width; 
    pPanelContainer.Height = 50; 
    pPanelContainer.BackColor = Color.FromArgb(
     Convert.ToInt32(aWhiteContentBackgroundColors[0]), 
     Convert.ToInt32(aWhiteContentBackgroundColors[1]), 
     Convert.ToInt32(aWhiteContentBackgroundColors[2])); 

    pPanelContainer.Name = "PanelContainer" + iPanelNumber.ToString(); 
    pPanelContainer.Visible = false; 
    pPanelContainer.Location = new Point(0, 0); 
} 

Так как вы можете видеть, я дал панели я создать имя «PanelContainer1», «PanelContainer2» и т.д ...

Но как я могу достичь эти панели?

Я, конечно, не мог добраться до них, написав:

PanelContainer1.visible = true; 

Кто есть идея?

Заранее спасибо

+1

BTW: вы не увеличиваете число iPanelNumber в своем цикле! Является ли это копией/прошлой ошибкой? – M4N

ответ

2

Самый простой способ, вероятно, чтобы добавить List<Panel> поле для вашей ссылки класса и магазинов для всех панелей в этом списке, например:

class MyClass 
{ 
    private List<Panel> _panels = new List<Panel>(); 

    void MethodWhichCreatesThePanels() 
    { 
    //.. 
    foreach (string[] Persons in alItems) 
    { 
     Panel pPanelContainer = new Panel(); 
     _panels.Add(pPanelContainer); 
     ... 
    } 
    } 

Затем вы можете получить доступ к каждой панели позже с помощью индекс: ответ

Panel aPanel = _panels[i]; 
+0

Хорошо! Я попробую. Спасибо! – Ikky

0

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

То, что он не делает, это установить имя переменной.

Что это сделать следующее (из MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.name.aspx)

Свойство Имени может быть использовано во время выполнения, чтобы оценить объект по имени, а не типу и программным именем. Поскольку свойство Name возвращает тип String, его можно оценить в логических операциях case-style (оператор Select в Visual Basic, оператор switch в Visual C# и Visual C++).

0

Вы не можете ссылаться на Panel по его названию, потому что в форме (или локальной переменной) с этим именем нет поля. Эти поля определены в файле частичного класса для Form, который генерирует конструктор форм; они не созданы (и не могут быть) созданы во время выполнения.

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

Самый очевидный способ сделать это - добавить Panel в свою коллекцию управления Controls после ее создания. Так как вы установили Visible в false, это не будет иметь никакого видимого эффекта на вашу форму. Так что в вашем коде, вы бы добавить что-то вроде

contentPanel.Add(p); 

Вы можете ссылаться на него по имени:

contentPanel.Controls["PanelContainer1"].Visible = true; 

Если по каким-то причинам вы не хотите, чтобы добавить его в Controls коллекции еще (есть много причин, по которым вы не можете этого сделать), следующий подход - создать экземпляр класса коллекции какого-либо типа и добавить Panel в эту коллекцию. Поскольку вы хотите иметь возможность ссылаться на него по имени, самым очевидным выбором будет словарь, например.:

Dictionary<string, Panel> panels = new Dictionary<string, Panel>; 
... 
panels.Add(p.Name, p); 

И снова, вы можете ссылаться на него по имени:

panels["PanelContainer1"].Visible = true; 

... хотя в этом случае Panel бы на самом деле не станет видимым, потому что это не в Controls коллекции контроля видимого контейнера.

Как раз в сторону: если это в ваших силах, вы должны положить конец использованию префиксов типа в именах переменных. Есть еще магазины, которые используют это соглашение, но он вообще был оставлен сообществом программистов на C#.

+0

ах, спасибо за хороший ответ. чаще всего используется «_» перед переменной varablame? – Ikky

+0

Поскольку среда IDE может вообще сказать вам, какой тип переменной, обычно не рекомендуется вставлять тип в свое имя. Это небольшой кусок очень большой темы: см., Например, http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx. –