dポイントプレゼントキャンペーン実施中!

プログラムの勉強を始めたばかりのものです。
Visual Studio Community 2017 を使用して C# で Windows Form Application を勉強中です。

質問させていただきたいのですが、例えば自身のフォームの背景を変えるなら‥
-----------------------------------------------------------
 this.BackColor = ~~~;
-----------------------------------------------------------
のように「this」が使えると思うのですが、Form自身ではなくFormに配置したコントロールの
「panelA」や「panelB」の背景をイベントで変えたいときに
-----------------------------------------------------------
 panelAのイベント(object sender, EventArgs e)
 {
   panelA.BackColor = ~~~;
 }
 panelBのイベント(object sender, EventArgs e)
 {
   panelB.BackColor = ~~~;
 }
-----------------------------------------------------------
のように書くと、中身の記述を共通化できないので‥
-----------------------------------------------------------
 panelAのイベント(object sender, EventArgs e)
 {
   this.私自身.BackColor = ~~~;
 }
 panelBのイベント(object sender, EventArgs e)
 {
   this.私自身.BackColor = ~~~;
 }
-----------------------------------------------------------
のような感じで共通の記述になるよう指定できないのかな?と思ったのですが、可能でしょうか?

お分かりになる方いらっしゃいましたらご教授ください。
よろしくお願いします。m(_ _)m

A 回答 (4件)

>Formに配置したコントロールの「panelA」や「panelB」の背景をイベントで変えたいとき



元々配置されているなら、

private void Form1_Load(object sender, EventArgs e)
{
foreach (Panel pn in this.Controls.OfType<Panel>())
pn.Click += new System.EventHandler(this.panel_Click);
}

private void panel_Click(object sender, EventArgs e)
{
((Panel)sender).BackColor = ((Panel)sender).BackColor == Color.Aqua ? SystemColors.Control : Color.Aqua;
}

とか、Panelが他にもあるのなら、

private void Form1_Load(object sender, EventArgs e)
{
foreach (Panel pn in new Panel[]{panelA,panelB})
pn.Click += new System.EventHandler(this.panel_Click);
}

private void panel_Click(object sender, EventArgs e)
{
((Panel)sender).BackColor = ((Panel)sender).BackColor == Color.Aqua ? SystemColors.Control : Color.Aqua;
}

など。(色を戻すのは不要だったかな?)
    • good
    • 0
この回答へのお礼

めぐみん_さん

サンプルコードまでありがとうございます。
しかもなるほど、foreachで配置しているパネルにイベントを一括で生成していけるのですね。
実際にパネルを沢山並べてみて、背景色を変えていけることを確認できました!
感謝です。。

お礼日時:2018/05/08 01:05

既に回答がありますが、この方法には三つデメリットがあります。


それは、
1. イベントの紐付けをコードで記述しなければならない。
2. デザイナでイベントをクリックしても、当該メソッドを表示することが出来ない。
3. 上記デメリットの関係で、直感的に何のオブジェクトを操作しているメソッドか分からなくなる。

まぁ、これらがメリットになることも十分にありえますが、始めて間もない方には少々混乱を招くことかと思います。

そこで、回答にある方法以外にも方法があることを記しましょう。
それは、イベントはデザイナ上から生成させるが、処理は、共通のメソッドを用意する、です。

panelAのイベント(object sender, EventArgs e)
{
ChangePanelStyle((Panel)sender);
}
panelBのイベント(object sender, EventArgs e)
{
ChangePanelStyle((Panel)sender);
}
private void ChangePanelStyle(Panel panel)
{
panel.BackColor = ......;
}
    • good
    • 0
この回答へのお礼

naktakさん

ご回答ありがとうございます。
遅れてのお返事ですみません、ご回答を見逃していました。。

ご提示いただいた記述はまさに私ができたらいいなと思っていたものです!
なるほど、関数ではPanel型を引数で渡すようにすれば共通化できたのですね。。
おっしゃるように、私みたいな初心者にはこちらが一番わかりやすいかと思いました。
感謝です!

お礼日時:2018/05/09 00:02

スマホからなので具体的には書けませんが。



やりたいことの違いが今一つわかりません
イベントが同じ事を指すのであれば、『イベントハンドラの共有』について調べてみるべきかと
そしてどちらでイベントが発生したかを『sender』で得れば良いのでは?
    • good
    • 0
この回答へのお礼

めぐみん_さん

ご回答ありがとうございます。
なるほど、まさにおっしゃる「イベントハンドラの共有」がしたかったことでした!
そのようなことが可能なことを知らなかったので何をどう調べたら良いかも分かりませんでした。
パネルが大量にある場合に、イベントの中のパネル名を1つずつ書き換えるのが不便と思ったのです。

お礼日時:2018/05/08 00:59

// あくまで俺のはサンプル


// 書くのが久しぶりすぎて一瞬何だっけってなった。デフォルトでフォームを作らせるとInitializeComponentとかいう名前のルーチンを作ったり、初期化処理の間フォームの描画を停止したりするようなコード書いてた気がする。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Sample
{
class Form1 : Form
{
private TextBox tb1;
private TextBox tb2;
Form1()
{
this.Width = 800;
this.Height = 150;

tb1 = new TextBox();
tb1.Left = 0;
tb1.Top = 0;
tb1.Width = 400;

tb2 = new TextBox();
tb2.Left = 0;
tb2.Top = 50;
tb2.Width = 400;

tb1.TextChanged += Textbox_TextChanged;
tb2.TextChanged += Textbox_TextChanged;

this.Controls.Add(tb1);
this.Controls.Add(tb2);
}

private static void Textbox_TextChanged(object sender,EventArgs e)
{
((TextBox)sender).BackColor = Color.Red;
}

static void Main(string[] args)
{
Form1 f = new Form1();
f.ShowDialog();
}


}
}
    • good
    • 0
この回答へのお礼

himajin100000さん

ご回答ありがとうございます。
なるほど、そのように書くことができるのですね‥!
TextBoxに文字を打ち込むと背景色が変わることを確認できました。

お礼日時:2018/05/08 00:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!