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

タブコントロールにラベルのみが含まれている場合

 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

再宣言を削除

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

...残りは同じです

これは必要な最小の変更ですが、コンパイラの警告に注意を払う必要があります。ほとんどの場合、フィールドを再宣言したことを警告しました。

于 2012-09-08T21:38:49.380 に答える
0

問題は、スコープまたは初期化の欠如である可能性が最も高いです。コンテキストCalendar_Weekday_Day内にのみ存在します。Form1_Shown別のメソッドからアクセスしようとすると、それを見ることができなくなります (また、プライベートの場合、新しい要素を追加するためにまだ初期化されていないため、問題が発生する可能性があります)。次の 2 つのオプションがあります。

  • スコープを変更します (Calendar_Weekday_Dayフォームのクラスにプライベート プロパティを作成し、初期化することを忘れないでください)。
  • にアクセスしてコントロールを検索しますthis.TabControl1.Controls

また、後でコントロールにアクセスする際にもう少し柔軟性を持たせるために、private IEnumerable<Label> Calendar_WeekendDayまたは使用したほうがよい場合もあります。IList<Label>

于 2012-09-08T21:34:52.760 に答える