簡體   English   中英

c#如何到達程序運行時創建的面板?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM