![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
プログラムの勉強を始めたばかりのものです。
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
No.3ベストアンサー
- 回答日時:
>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;
}
など。(色を戻すのは不要だったかな?)
めぐみん_さん
サンプルコードまでありがとうございます。
しかもなるほど、foreachで配置しているパネルにイベントを一括で生成していけるのですね。
実際にパネルを沢山並べてみて、背景色を変えていけることを確認できました!
感謝です。。
No.4
- 回答日時:
既に回答がありますが、この方法には三つデメリットがあります。
それは、
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 = ......;
}
naktakさん
ご回答ありがとうございます。
遅れてのお返事ですみません、ご回答を見逃していました。。
ご提示いただいた記述はまさに私ができたらいいなと思っていたものです!
なるほど、関数ではPanel型を引数で渡すようにすれば共通化できたのですね。。
おっしゃるように、私みたいな初心者にはこちらが一番わかりやすいかと思いました。
感謝です!
No.2
- 回答日時:
スマホからなので具体的には書けませんが。
やりたいことの違いが今一つわかりません
イベントが同じ事を指すのであれば、『イベントハンドラの共有』について調べてみるべきかと
そしてどちらでイベントが発生したかを『sender』で得れば良いのでは?
めぐみん_さん
ご回答ありがとうございます。
なるほど、まさにおっしゃる「イベントハンドラの共有」がしたかったことでした!
そのようなことが可能なことを知らなかったので何をどう調べたら良いかも分かりませんでした。
パネルが大量にある場合に、イベントの中のパネル名を1つずつ書き換えるのが不便と思ったのです。
No.1
- 回答日時:
// あくまで俺のはサンプル
// 書くのが久しぶりすぎて一瞬何だっけってなった。デフォルトでフォームを作らせると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();
}
}
}
himajin100000さん
ご回答ありがとうございます。
なるほど、そのように書くことができるのですね‥!
TextBoxに文字を打ち込むと背景色が変わることを確認できました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- 英語 丁寧な伺い(参加可否を促したい)英文を知りたいです。 2 2022/06/28 06:57
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#】別フォームも同時に閉じ...
-
C#で、ある条件でFormが自動で...
-
別フォームからdatagridviewの削除
-
C# FlowLayoutPanelのコントロ...
-
form2 から form1に戻ったとき...
-
C# 自分自身のコントロールを指...
-
【C#】サブフォームからメイン...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
コンボボックス内の文字サイズ変更
-
検索の画面がでなくなってしま...
-
VBAのフォント変更(エクセルか...
-
vbaから他のアプリを終了
-
3次元空間上の2つの座標から...
-
マインクラフト(pc版)で座標...
-
コントロールの書式設定で、“コ...
-
作成したウインドウのサイズを...
-
エクセルのコントロールツール...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#】別フォームも同時に閉じ...
-
C#で、ある条件でFormが自動で...
-
C# フォームを閉じてもプログラ...
-
【C#】サブフォームからメイン...
-
C# 自分自身のコントロールを指...
-
C# FlowLayoutPanelのコントロ...
-
別フォームからdatagridviewの削除
-
C#でテキストボックスをクリッ...
-
ASP.NetでJavaScriptからポスト...
-
OutLookのメール受信通知 (C#)
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
フォントの大きさ
-
コンボボックス内の文字サイズ変更
-
エクセルのコントロールツール...
-
マインクラフト(pc版)で座標...
-
PCで「使用可能な場合はグラフ...
-
vbaから他のアプリを終了
おすすめ情報