[英]c# How to reach a panel that is beeing created while program is running?
我有這個循環:
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;
有人知道嗎?
提前致謝
最簡單的方法可能是向您的班級添加一個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];
Martin的答案幾乎就是您要查找的內容,但是您似乎對面板控件的.Name屬性的功能感到困惑。
它不做的是設置變量的名稱。
它的作用如下(從MSDN: http : //msdn.microsoft.com/zh-cn/library/system.windows.forms.control.name.aspx )
Name屬性可以在運行時用於通過名稱而不是類型和程序名稱來評估對象。 因為Name屬性返回String類型,所以可以在大小寫樣式的邏輯語句(Visual Basic中的Select語句,Visual C#和Visual C ++中的switch語句)中對其求值。
您無法通過Panel
名稱來引用Panel
,因為表單(或本地變量)中沒有使用該名稱的字段。 這些字段在表單設計器生成的Form
的部分類文件中定義; 它們不是(也不能)在運行時創建的。
這並不意味着您無法通過其名稱訪問它。 您只是無法通過將其名稱用作代碼中的變量名稱來訪問它。
最明顯的方法是在創建Panel
后將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#程序員社區通常已放棄了該約定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.