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;