1

説明するのは少し難しいですが、この疑似 C# は、私がやろうとしていることを説明するはずです。

Windows フォームには多数のラベルがあります。

これらのラベルのテキストの色を変更したいと思います。

private void allBlackLabels()
{
    int[] lray = { 1, 2, 3, 5, 6 };
    foreach (int i in lray)
    {
        label[i].Forecolor = Color.Black;
    }            
}

私がここでやろうとしていることを説明してくれることを願っています。

ラベル[i]が原因で機能しないことは明らかですが、どうすればこれを回避できますか?

4

9 に答える 9

4

ラベルが配列に保持されていないため、機能しない可能性があります。変更するラベルの名前がわかっている場合、次のコードが機能します。

Label[] lray = { labelOne, labelDifferent, labelWhatElse };
foreach (Label label in lray)
{
    label.ForeColor = Color.Black;
}            
于 2011-10-17T09:26:52.610 に答える
1

実際にラベルの配列がある場合、それはうまくいきます。

次のように、多くの変数しかない場合:

private Label label1;
private Label label2;
private Label label3;
private Label label4;
private Label label5;

それは難しいです。オプション:

  • 代わりに配列を使用するようにコードを変更してください。デザイナーとしてはそれほど優れていませんが、より論理的です
  • Controls.Find各IDで利用
  • 名前に関係なく、すべてのコントロールControlsを見つけるために繰り返します Label
于 2011-10-17T09:25:15.743 に答える
1
foreach (Control c in this.Controls)
{
    if (c is Label)
    {
        // do stuff
    }
}

これにより、フォームのすべての子コントロールが取得され (このコードがフォームのコード ビハインドにある場合)、それらがラベルかどうかがチェックされます。コメントの代わりに必要な操作を行うだけです。

于 2011-10-17T09:25:16.227 に答える
0

配列を自分で作成できます。ただし、これには、フォームが変更されるたびに、多少のメンテナンス コスト/リスクが伴います。注: おそらく、配列作成ビットをコンストラクターではなく Form Loaded イベントに配置するか、少なくともInitializeComponent呼び出しの後に配置して、コントロールがセットアップされるようにする必要があります。

または、(フォーム メソッドから) フォームのすべての子を反復処理しthis.Controlsたり、特定のタグでラベルをマークしたり、それが目的の場合はすべてのラベルを取得したりできます。

フォームに多くのコントロールがある場合、実行時のパフォーマンスに関しては、最初のソリューションの方がおそらくはるかに高速であることに注意してください。

于 2011-10-17T09:24:59.643 に答える
0
private void allBlackLabels()
{
    int[] lray = { 1, 2, 3, 5, 6 };
    foreach (int i = 0; i < lray.Length; i++)
    {
        ((Label)this.Controls["label" + i]).ForeColor = Color.Black;
    }            
}
于 2011-10-17T09:25:35.003 に答える
0

あなたの例では、「lray」配列から 4 を除外していることに気付きました。1 つまたは複数のラベルをコードによる自動更新から除外する場合 (おそらくグループ内の 1 つを強調表示する場合)、これを試してください。

    private void allBlackLabels()
    {    
        foreach (Control control in this.Controls)            
        {
            if (control is Label && control.Name != "label4")
            {
                (control as Label).Forecolor = Color.Black;
            }
        }
    }
于 2014-12-23T05:52:40.837 に答える
0

フォームのすべてのラベルでこれを実現したい場合は、次のようなものが役立ちます。

foreach (Control control in this.Controls) {
     if (control is Label) {
         (control as Label).Forecolor = Color.Black;
     }
}

ただし、すべてのラベルのサブセットのみを変更する必要がある場合は、変更が必要なラベルの名前またはインデックスを保存する必要があります。これはthis.Controls、int32 と文字列の 2 つのインデクサーがあるためです。したがって、このようなことを試すことができます

private void allBlackLabels()
{
    int[] lray = { 1, 2, 3, 5, 6 };
    foreach (int i in lray)
    {
         this.Controls[i].Forecolor = Color.Black;
    }            
}

ただし、順序付けが配列this.Controlsほど線形ではない可能性が高いことに注意してくださいlray。お役に立てれば

于 2011-10-17T09:29:24.217 に答える
0

次のようなことを試してください:

List<string> ListLabelNames = new List<string>() { /* Your label name list*/ };

foreach (Label TmpLabel in this.Controls.OfType<Label>())
{
    foreach (string strTmp in ListLabelNames)
    {
        if (String.Compare(TmpLabel.Name, strTmp, true) == 0)
            TmpLabel.ForeColor = System.Drawing.Color.Black;
    }
}

お役に立てれば。

于 2011-10-17T09:29:41.040 に答える
-1

疑似C#で:

List<String> controlsToChange =new List<String>{"lable1Name","lable2Name"};
foreach(Control control in form.Controls)
{
    if(control.GetType().Equals(typeof(Lable))
    {
         if( controlsToChange.Contains(control.Name)
         {
              control.Forecolor=Colour.Black;
         }
    }
}
于 2011-10-17T09:26:22.103 に答える