我在运行时创建了一个标签数组。现在,我在从其他函数访问这些标签时遇到了问题。
动态创建:
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";
}