如何访问动态创建的标签数组



我在运行时创建了一个标签数组。现在,我在从其他函数访问这些标签时遇到了问题。

动态创建:

private void Form1_Shown(object sender, EventArgs e)
{
    Label[] Calendar_Weekday_Day = new Label[7];
    for (int i = 0; i < 7; i++)
    {
        Calendar_Weekday_Day[i] = new Label();
        Calendar_Weekday_Day[i].Location = 
                                    new System.Drawing.Point(27 + (i * 137), 60);
        Calendar_Weekday_Day[i].Size = new System.Drawing.Size(132, 14);
        Calendar_Weekday_Day[i].Text = "Montag, 01.01.1970";
        this.TabControl1.Controls.Add(Calendar_Weekday_Day[i]);
    }
}

以及我想访问动态创建的标签阵列的功能:

private void display_weather_from_db(DateTime Weather_Startdate)
{
    Calendar_Weekday_Day[0].Text = "Test1";
    Calendar_Weekday_Day[1].Text = "Test2";
}

显示错误:

当前日历中不存在名称"Calendar_Weekday_Day"上下文Form1.cs 1523 25测试

我试过了,但没有帮助:(

public partial class Form1 : Form
{
    private Label[] Calendar_Weekday_Day;
}

有人有主意吗?

我想你只需要

Calendar_Weekday_Day = new Label[7];

而不是

Label[] Calendar_Weekday_Day = new Label[7];

在您的Form_Shown中。正如现在所写的,您将列表存储到一个局部变量中,而不是实例字段中。

问题很可能是作用域或缺乏初始化。CCD_ 2仅存在于CCD_ 3上下文中。如果你试图从另一个方法访问它,你将无法看到它(当它是私有的时,它仍然没有初始化为添加新元素将是有问题的)。你有两个选择:

  • 更改作用域(使Calendar_Weekday_Day成为表单类中的私有属性,不要忘记初始化它)
  • 通过访问this.TabControl1.Controls搜索控件

您还可以使用private IEnumerable<Label> Calendar_WeekendDay甚至IList<Label>,以便在以后访问控件时有更大的灵活性。

删除重新声明

private void Form1_Shown(object sender, EventArgs e)
{
    Calendar_Weekday_Day = new Label[7]; // removed Label[] 

其余的是相同的

这将是所需的最小更改,但您应该注意编译器警告。它很可能警告您重新申报了field。

如果您的tabcontrol只包含标签,那么

 private void display_weather_from_db(DateTime Weather_Startdate)
 {
 Label[] Calendar_Weekday_Day = this.TabControl1.Controls.OfType<Label>().ToArray();
 Calendar_Weekday_Day[0].Text = "Test1";
 Calendar_Weekday_Day[1].Text = "Test2";
 }

如果有更多的其他标签你必须过滤,所以首先

  for .....
   ... _Day[i].Size = new System.Drawing.Size(132, 14);
    Calendar_Weekday_Day[i].Text = "Montag, 01.01.1970";
    Calendar_Weekday_Day[i].Tag= "Weather";// specify your label tag
    this.TabControl1.Controls.Add(Calendar_Weekday_Day[i]);
  ....

然后

 private void display_weather_from_db(DateTime Weather_Startdate)
 {
 Label[] Calendar_Weekday_Day = this.TabControl1.Controls.OfType<Label>().Where(X=>X.Tag!=null && X.Tag=="Weather").ToArray();

 Calendar_Weekday_Day[0].Text = "Test1";
 Calendar_Weekday_Day[1].Text = "Test2";
 }

最新更新