0

我有这个 for 循环:

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;

有人有想法吗?

提前致谢

4

3 回答 3

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];
于 2009-09-29T19:35:08.497 回答
0

Martin 的答案几乎是您正在寻找的,但您似乎对面板控件的 .Name 属性的作用感到困惑。

它不做的是设置变量的名称。

它的作用如下(来自 MSDN:http: //msdn.microsoft.com/en-us/library/system.windows.forms.control.name.aspx

Name 属性可用于在运行时按名称而不是类型和编程名称来评估对象。由于 Name 属性返回 String 类型,因此可以在 case 样式的逻辑语句(Visual Basic 中的 Select 语句、Visual C# 和 Visual C++ 中的 switch 语句)中对其进行计算。

于 2009-09-29T20:03:56.893 回答
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# 程序员社区普遍抛弃。

于 2009-09-29T20:06:01.150 回答