c#如何到达程序运行时创建的面板?

c#如何到达程序运行时创建的面板?,c#,panel,C#,Panel,我有一个循环: int iPanelNumber = 1; foreach (string[] Persons in alItems) { Panel pPanelContainer = new Panel(); pPanelContainer.Width = contentPanel.Width; pPanelContainer.Height = 50; pPanelContainer.BackColor = Color.FromArgb(

我有一个循环:

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;
有人有主意吗


提前感谢

最简单的方法可能是在类中添加一个
列表
字段,并存储对该列表中所有面板的引用,例如:

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

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

Martin的答案与您所寻找的基本相同,但您似乎对panel控件的.Name属性的作用感到困惑

它没有做的是设置变量的名称

它的作用如下(来自MSDN:)


Name属性可在运行时用于按名称而不是按类型和编程名称计算对象。由于Name属性返回字符串类型,因此可以在大小写样式的逻辑语句(Visual Basic中的Select语句、Visual C#和Visual C++中的switch语句)中对其求值。

您不能按名称引用
面板,因为表单(或局部变量)中没有具有该名称的字段。这些字段在表单设计器生成的
表单的分部类文件中定义;它们不是(也不能)在运行时创建的

这并不意味着你不能通过它的名字访问它;在代码中使用它的名称作为变量名是无法访问它的

最明显的方法是在创建
面板后,将其添加到其包含控件的
控件的
集合中。由于已将
Visible
设置为false,因此这不会对表单产生任何可见影响。因此,在代码中,您可以添加如下内容

contentPanel.Add(p);
然后,您可以按名称引用它:

contentPanel.Controls["PanelContainer1"].Visible = true;
panels["PanelContainer1"].Visible = true;
如果出于某种原因,您还不想将其添加到
控件
集合中(有很多原因您可能不想添加),下一种方法是创建某种集合类的实例,并将
面板
添加到该集合中。由于您希望能够通过名称引用它,最明显的选择是词典,例如:

Dictionary<string, Panel> panels = new Dictionary<string, Panel>;
...
panels.Add(p.Name, p);
…虽然在这种情况下,
面板
实际上不可见,因为它不在可见容器控件的
控件
集合中


顺便说一句:如果你有能力这么做,你应该停止在变量名上使用类型前缀。仍然有一些商店使用这种约定,但C#程序员社区通常会放弃这种约定。

顺便说一句:你的循环中没有增加iPanelNumber!这是一个副本/过去的错误吗?啊,谢谢你的回答。在variablename之前使用“u”更常见吗?因为IDE通常可以告诉您变量是什么类型,所以在其名称中嵌入类型通常是没有用的。这是一个非常大的主题的一小部分:例如,请看。
panels["PanelContainer1"].Visible = true;