2009-09-29 33 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

順便說一句:你沒有在你的循環中遞增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

馬丁的答案几乎是你在找什麼,但它似乎混淆了什麼名稱屬性y的面板控制。

它沒有做的是設置變量的名稱。

它所做的是以下(從MSDN:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.name.aspx

Name屬性可以在運行時使用的名稱,而不是類型和程序名評估對象。由於Name屬性返回String類型,因此可以在案例式邏輯語句(Visual Basic中的Select語句,Visual C#和Visual C++中的switch語句)中評估它。

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

啊,謝謝你的回答。 在變量名之前使用「_」更常見嗎? – Ikky

+0

由於IDE通常可以告訴您變量是什麼類型,因此將其嵌入名稱通常無用。這是一個非常大的主題的一小部分:例如,請參閱http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx。 –