带变量名的面板控件

Panel control with variable name

我有25个面板控件(Visible false)。 我想让它可见。

但它不起作用: (错误 1 ​​'string' 不包含 'Visible' 的定义,并且找不到接受类型 'string' 的第一个参数的扩展方法 'Visible'(您是否缺少 using 指令或装配参考?) )

for (int i = 0; i < 25; i++)
{
    string panelID = "panel" + i.ToString();
    panelID.Visible = true;
}

帮助

你的代码在很多方面都是错误的。

实际上,您正在做的是创建 25 个字符串,其值为 panel0panel1panel2 等,并尝试为 属性 的。但是字符串不包含名为 Visible 的 属性,所以很明显你会得到一个错误。

您要做的是获取表单中 Panel 类型的控件,并设置它们的值。

foreach(var panel in this.Controls.OfType<Panel>())
{
    panel.Visible = true;
}

警告:以上内容只会在您最顶层的表单中找到 Panel 控件。如果有嵌套的控件,您可能想要编写一个方法来递归地查找它们。以上仅供参考。

此外,如果您有多个 Panel 控件并且您只想设置这些面板名称的 属性 符合您的命名约定,您可以将它们过滤掉。

foreach(var panel in this.Controls.OfType<Panel>())
{
    if( panel name fits your naming convention)
        panel.Visible = true;
}

在这里,您可以使用Regex、使用自定义函数等来查找正确的面板名称

您可以将所有动态创建的面板存储到一个集合中,您可以从中通过名称引用它们。一个这样的集合是字典。

public class Form1 : Form
{
    Dictionary<string, Panel> panels = new Dictionary< string, Panel>();
    public void Form1_Load(object sender, EventArgs e)
    {
        for (var i = 0; i < 25; I++)
        {
             Panel panel = new Panel();
             panel.Name = "panel" + i.ToString();
             this.Controls.Add(panel);
             panels.Add(panel.Name, Panel);
         }
     }
}

现在您可以使它们可见/不可见,如下所示。

private void ShowHidePanel(int panelNumber, bool visible)
{
    panels["panel"+panelNumber.ToString()].Visible = visible ;
}

或者,如果您想显示或隐藏所有面板,您可以按照以下步骤进行操作。

private void ShowHidePanels(bool visible)
{
    for (var i = 0; i < 25; i++)
    {
         panels["panel" + i.ToString()].Visible = visible;
    }
}