none
ラベル色の変更の問題です。 RRS feed

  • 質問

  • こんにちは、C#の初心者です、宜しくお願いします。


    今、label1~label5 五つ配置しました、文字色はBlue。

    やりたいことは、
    クリックされたラベルの色は変更します。Blue→Black(ここまで、大丈夫です)
    それから、他のラベルをクリックしたら、
    前回クリックされたラベルの色は Black→Blueに戻ります。
    クリックしたラベルだけ、色を変更したいです。


    *一回初期値に戻ることは、できますが、他の方法があれば、教えて頂きたいです。*

    宜しくお願いいたします。

    2007年11月6日 7:46

回答

  • こんばんは。zen73です。素人の私には4行で程度で終わるなんて魔法みたいな話で,是非ともこの魔法をつかえるようになりたいと思います。下に私ができることをかいてみました。

     

    namespace ラベルクリック
    {
        public partial class Form1 : Form
        {
            //ラベルの配列
            private Label[] lblArray;
           
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //ラベルコントロールの配列を作成
                this.lblArray = new Label[ 5];
                //ラベルコントロールの配列に代入
                this.lblArray[ 0] = this.label1;
                this.lblArray[ 1] = this.label2;
                this.lblArray[ 2] = this.label3;
                this.lblArray[ 3] = this.label4;
                this.lblArray[ 4] = this.label5;
                //イベントハンドらに関連付け
                for (int i = 0; i < this.lblArray.Length; i++)
                {
                    this.lblArray [ i].Click +=

             new System .EventHandler (this.lblArray_Click);
                    //this.lblArray[ i].MouseLeave +=

             new System.EventHandler(this.lblArray_MouseLeave);
                    //this.lblArray[ i].MouseEnter +=

             new System.EventHandler(this.lblArray_Enter);
                }

            }
            //ラベルのインデックス番号を取得して返す
            private int returnIndex(object sender)
            {
                int index = -1;
                for (int i = 0; i < lblArray.Length; i++)
                {
                    if (lblArray[ i].Equals(sender))
                    {
                        index = i;
                        break;
                    }
                }
                return index;
            }
            //ラベルをクリックしたとき
            private void lblArray_Click(object sender, EventArgs e)
            {
                //クリックしたラベルのインデックス番号
                int index;
                index =returnIndex (sender );
                for (int i = 0; i < 5; i++)
                {
                    lblArray[ i].ForeColor = Color.Blue;
                }
                lblArray[index].ForeColor = Color.Black;
            }

        }
    }

    2007年11月6日 9:45

すべての返信

  • 1 つ前に Click された Label がどのインスタンスかを記憶しておけば 4 行程度で終わりですよね。

    2007年11月6日 7:57
  •  

    <1 つ前に Click された Label がどのインスタンスかを記憶しておけば 4 行程度で終わりですよね。>

    ご返答を頂き、有難う御座います。

     

    インスタンスを記憶について、

    宜しければ、もうちょっと詳しく教えて頂けないでしょうか。

    宜しくお願い致します。

     

     

    2007年11月6日 8:23
  • こんばんは。zen73です。素人の私には4行で程度で終わるなんて魔法みたいな話で,是非ともこの魔法をつかえるようになりたいと思います。下に私ができることをかいてみました。

     

    namespace ラベルクリック
    {
        public partial class Form1 : Form
        {
            //ラベルの配列
            private Label[] lblArray;
           
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //ラベルコントロールの配列を作成
                this.lblArray = new Label[ 5];
                //ラベルコントロールの配列に代入
                this.lblArray[ 0] = this.label1;
                this.lblArray[ 1] = this.label2;
                this.lblArray[ 2] = this.label3;
                this.lblArray[ 3] = this.label4;
                this.lblArray[ 4] = this.label5;
                //イベントハンドらに関連付け
                for (int i = 0; i < this.lblArray.Length; i++)
                {
                    this.lblArray [ i].Click +=

             new System .EventHandler (this.lblArray_Click);
                    //this.lblArray[ i].MouseLeave +=

             new System.EventHandler(this.lblArray_MouseLeave);
                    //this.lblArray[ i].MouseEnter +=

             new System.EventHandler(this.lblArray_Enter);
                }

            }
            //ラベルのインデックス番号を取得して返す
            private int returnIndex(object sender)
            {
                int index = -1;
                for (int i = 0; i < lblArray.Length; i++)
                {
                    if (lblArray[ i].Equals(sender))
                    {
                        index = i;
                        break;
                    }
                }
                return index;
            }
            //ラベルをクリックしたとき
            private void lblArray_Click(object sender, EventArgs e)
            {
                //クリックしたラベルのインデックス番号
                int index;
                index =returnIndex (sender );
                for (int i = 0; i < 5; i++)
                {
                    lblArray[ i].ForeColor = Color.Blue;
                }
                lblArray[index].ForeColor = Color.Black;
            }

        }
    }

    2007年11月6日 9:45
  • zen73さんへ

    今晩は、剣道です。

    ご返答を頂き、大変有難う御座いました。

     

    私は、初心者なんて、先程、じゃんぬねっとさんからのアドバイスは、本当に理解してなかったです。

    <1 つ前に Click された Label がどのインスタンスかを記憶しておけば 4 行程度で終わりですよね。>

    zen73さんがすぐ理解しまして、素晴らしいですね。

    今、試したところ,思い通りの動作になりました。

    とても参考になりました。

    今後ともよろしくお願い申し上げます。

     

     

     

     

    2007年11月6日 10:15
  • えっと、ここで色を変えたのは2つのラベルですよね。一つは前回クリックされて黒くなっているラベルを青に、もう一つは今クリックされたラベルを青から黒にです。

    今クリックされたラベルはわかりますから、簡単に黒にできますよね。では、前回クリックされたラベルはどうでしょうか? もちろん、今黒くなっているラベルを一つずつ探せばわかるのですが、もっと効率が良いのは、前回クリックされたラベルをしまっておいて、それを青に変えればいいわけです。前回クリックされたラベルをしまっておく、いいかえれば前回クリックされたラベルのインスタンスをしまっておくということです。

    上の文章をC#にすると以下のような感じになります。

     

    Label prevLabel;  //前回クリックされたラベル

     

    private void CommonLabel_Click(object sender, EventArgs e)
    {

          if (prevLabel != null)  prevLabel.ForeColor = Color.Blue;

     

          Label lbl = (Label)sender;
          

         lbl.ForeColor = Color.Black;

     

          prevLabel = lbl;
    }

    2007年11月6日 12:22
    モデレータ
  • zen73です。

     剣道 さんからの引用

    zen73さんがすぐ理解しまして、素晴らしいですね。

    実はご存知のとおり質問を連発している私ですが,剣道さんの質問にお答えできるかなと思ってコードを書いていたところ,

     じゃんぬねっと さんからの引用

    1 つ前に Click された Label がどのインスタンスかを記憶しておけば 4 行程度で終わりですよね

    私もインスタンスをどう用いるのか理解できなかったものですから,剣道さんの質問に便乗してしまったのです。

     

     

    2007年11月6日 14:06
  • trapemiya さんに先を越されたので特に申し上げることはなさそうです。

    インスタンスをどこかの変数へ退避させ、そのインスタンスに対して元に戻せばよいわけです。

    2007年11月6日 15:51
  • お早うございます。zen73です。

    trapemiyaさんに教えていただいて書き直してみました。

    インスタンスを用いると,なにかしら洗練されたかんじですね。ありがとうございました。

    namespace ラベルクリック
    {
        public partial class Form1 : Form
        {
            //ラベルの配列
            private Label[] lblArray;

            Label prevLabel; 
           
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //ラベルコントロールの配列を作成
                this.lblArray = new Label[5];
                //ラベルコントロールの配列に代入
                this.lblArray[0] = this.label1;
                this.lblArray[1] = this.label2;
                this.lblArray[2] = this.label3;
                this.lblArray[3] = this.label4;
                this.lblArray[4] = this.label5;
                //イベントハンドらに関連付け
                for (int i = 0; i < this.lblArray.Length; i++)
                    this.lblArrayIdea.Click += new System.EventHandler(this.CommonLabel_Click);
            }
            //ラベルをクリックしたとき
            private void CommonLabel_Click(object sender, EventArgs e)
            {
                if (prevLabel != null) prevLabel.ForeColor = Color.Blue;
                Label lbl = (Label)sender;
                lbl.ForeColor = Color.Black;
                prevLabel = lbl;
            }
        }
    }

    2007年11月6日 21:38
  • 丁寧なご指導有り難う御座います。

    剣道です。
    trapemiya さんから教えて頂いたコードをそのまま使わせて頂き、
    問題なく動作しました。
    コードがもっと簡潔、短くなりまして、
    大変勉強に成りました。
    プログラムの世界は、またよくわからないけど、楽しいです。
    色々有難う御座いました。
    また宜しくお願い致します。

     

    2007年11月7日 0:58