2

我在运行时创建了一组标签。现在我无法从其他功能访问这些标签。

动态创作:

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;
}

有人出主意吗?

4

4 回答 4

3

我想你只需要

Calendar_Weekday_Day = new Label[7];

代替

Label[] Calendar_Weekday_Day = new Label[7];

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

于 2012-09-08T21:32:38.010 回答
0

如果您的 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";

 }
于 2012-09-08T22:57:52.943 回答
0

问题很可能是范围或缺乏初始化。Calendar_Weekday_Day只存在于Form1_Shown上下文中。如果您尝试从另一种方法访问它,您将无法看到它(当它是私有的时,它仍未初始化以添加新元素将会有问题)。你有两个选择:

  • 更改范围(Calendar_Weekday_Day在表单的类中创建一个私有属性,不要忘记初始化它)
  • 通过访问搜索控件this.TabControl1.Controls

您可能还可以更好地使用private IEnumerable<Label> Calendar_WeekendDay,甚至IList<Label>可以在以后访问控件时给您更多的灵活性。

于 2012-09-08T21:34:52.760 回答
0

删除重新声明

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

...其余的都是一样的

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

于 2012-09-08T21:38:49.380 回答