質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

3回答

686閲覧

class に含まれるひとつの要素の挙動を、別の要素に伝えるにはどうすればよいでしょうか。(Windows10, Visual Studio 2019, C#, .Net 4.7)

TAKASE_Hiroyuki

総合スコア21

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

1クリップ

投稿2020/01/14 12:24

編集2020/01/15 10:08

#背景

ラベルと画像を「組」にしたものを、画面上にたくさん配置したいと考えています。マウスを画像の上に乗せたときに、画像とラベルを同時に変更したいと考えています。

マウスを、画像の上に移動させたときに、MouseMove イベントが発生します。このイベントをとらえて、画像の背景色を変更させようと考え、次のようなプログラムを書いてみました。しかし「ふたつ同時に変更する」ということがうまくいきません。

#ソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace mytest 12{ 13 public partial class Form1 : Form 14 { 15 16 public static Panel PL; 17 18 public static void MoveOnPic(object sender, EventArgs e) 19 { 20 (sender as PictureBox).BackColor = Color.Red; 21 } 22 23 public Form1() 24 { 25 InitializeComponent(); 26 27 PL = new Panel(); 28 Controls.Add(PL); 29 PL.Size = new Size(800, 600); 30 31 Test tt; 32 tt = new Test(50); 33 tt = new Test(150); 34 } 35 } 36 37 public class Test 38 { 39 PictureBox Pic; 40 Label LB; 41 42 public Test(int y) 43 { 44 LB = new Label(); 45 Form1.PL.Controls.Add(LB); 46 LB.Size = new Size(100, 50); 47 LB.Location = new Point(50, y); 48 LB.BackColor = Color.FromArgb(40, 255, 0, 0); 49 50 Pic = new PictureBox(); 51 Form1.PL.Controls.Add(Pic); 52 Pic.Size = new Size(100, 50); 53 Pic.BackColor = Color.FromArgb(40, 0, 0, 255); 54 Pic.Location = new Point(200, y); 55 Pic.MouseMove += new MouseEventHandler(Form1.MoveOnPic); 56 } 57 } 58}

#エラー
この状態では、エラーは発生しません。

#質問

上のプログラムでは、マウスが画像の上に移動したときに、画像の背景色を変えましたが、ラベルの背景色も同時に変えるには、どのようにすればよろしいでしょうか。

上のプログラムでは、MouseOnPic 関数の引数の sender は Test Class の Pic を指しています。同じ class の中には、LB もありますので、

Pic と同じクラスに所属している LB について、
LB.BackColor = Color.Blue;
という命令を実行する

ということをやりたいのですが、MouseOnPic の引数の sender から 同じ class 内の LB にたどりつく方法がわかりません。

お手数ですが、御教授いただければ幸いです。

#解決方法
mmaeda様から教えていただいた方法で、解決しました。
その後、できるだけプログラムを簡素化しようと試みて、以下のようにしてみました。
このままコピペすると、ちゃんと動くと思います。

C#

1using System.Drawing; 2using System.Windows.Forms; 3 4namespace mytest 5{ 6 public partial class Form1 : Form 7 { 8 public static Panel PL; 9 10 public Form1() 11 { 12 InitializeComponent(); 13 PL = new Panel(); 14 Controls.Add(PL); 15 PL.Size = new Size(800, 600); 16 17 new Test(60); 18 new Test(120); 19 new Test(180); 20 new Test(240); 21 } 22 23 public static void MyMove(PictureBox pic, Label LB) 24 { 25 pic.BackColor = System.Drawing.Color.Red; 26 LB.BackColor = System.Drawing.Color.Yellow; 27 } 28 29 public static void MyLeave(PictureBox pic, Label LB) 30 { 31 pic.BackColor = Color.FromArgb(40, 0, 0, 255); 32 LB.BackColor = Color.FromArgb(40, 255, 0, 0); 33 } 34 } 35 36 public class Test 37 { 38 public PictureBox Pic; 39 public Label LB; 40 41 public Test(int y) 42 { 43 LB = new Label(); 44 Form1.PL.Controls.Add(LB); 45 LB.Size = new Size(100, 50); 46 LB.Location = new Point(50, y); 47 LB.BackColor = Color.FromArgb(40, 255, 0, 0); 48 49 Pic = new PictureBox(); 50 Form1.PL.Controls.Add(Pic); 51 Pic.Size = new Size(100, 50); 52 Pic.BackColor = Color.FromArgb(40, 0, 0, 255); 53 Pic.Location = new Point(200, y); 54 Pic.MouseMove += (s, e) => Form1.MyMove(Pic, LB); 55 Pic.MouseLeave += (s, e) => Form1.MyLeave(Pic, LB); 56 } 57 } 58}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

LabelとPictureBoxをセットにしたユーザーコントロールを作成してはどうですか?
ユーザーコントロール内でイベントを処理すれば、対になるLabelは確定するかと思います。

投稿2020/01/14 15:15

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKASE_Hiroyuki

2020/01/14 20:42

御回答いただき、ありがとうございました。 新しいユーザーコントロールを自分でつくるという発想は、まったくありませんでした。(ユーザーコントロールの存在自体を知りませんでした)。自分でつくってみて、いろいろと試してみたいと思います。特に、ojbect sender などがどのような挙動になるのか、興味があります。 ありがとうございました。
YAmaGNZ

2020/01/14 22:23

senderはイベントを発生させたオブジェクトが格納されるのでどこで処理してもPictureBoxとなります。 どこでイベントを処理するのかの違いです。 ユーザーコントロール内部であれば、イベントを発生させたPicutureBoxと対になるLabelしかないので、senderを使用せずに普通にLabelへアクセスすればいいことになります。 また、ユーザーコントロールを作成せずにLabelを配列で持って、PictureBoxのTagプロパティ等に対となるLabelの配列の添え字を格納しておき、イベント内で Labels[sender.Tag].BackColor=Color.Red; //キャストは必要かと みたいにアクセスするなど方法はいろいろあるかと思います。
TAKASE_Hiroyuki

2020/01/17 21:50

御回答いただき、ありがとうございました。 実は、リストを複数作成し、主たるリストを変更するときに、「Label だけのリスト」も更新して同期をとるという方法も検討しておりました。YAmaGNZ さんのおっしゃるとおりです。ありがとうございました。 ただ、リストが複数になると、それぞれのリストの整合性を保つことが煩雑になる可能性があります。とくに、リストの要素を削除したりする場合に、番号がズレる可能性があります。このため、class 内で処理する方法は無いだろうかと、質問させていただきました。
guest

0

ベストアンサー

anonymous とクロージャを使うとこうなります。テストしてませんが、試してみてください。

C#

1Pic.MouseMove += (sender, eventArgs) => 2{ 3 if (sender is PictureBox pictureBox) 4 { 5 pictureBox.BackColor = System.Drawing.Color.Red; 6 LB.BackColor = System.Drawing.Color.Yellow; 7 } 8};

投稿2020/01/15 03:48

mmaeda

総合スコア269

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKASE_Hiroyuki

2020/01/15 04:06

御回答いただき、ありがとうございます。 うまくいきました。ちゃんと、ラベルの色が変わりました。 この、 pictureBox.BackColor = System.Drawing.Color.Red; LB.BackColor = System.Drawing.Color.Yellow; の部分は関数にできるのか、試してみます。
guest

0

ふたつ同時に変更する

画像の背景色と、ラベルの背景色を同時に変えてみてはどうでしょう。

投稿2020/01/14 13:17

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKASE_Hiroyuki

2020/01/14 13:19

御回答いただき、ありがとうございます。 おっしゃるとおり、同時に変えたいのです。 でも、sender から、「どうやって、Label にたどりつけばよいか」が分かりません。sender は、PictureBox なので、そこからどうやって Label にたどりつけばよいのでしょうか。なにか、ヒントをいただければ幸いです。
fana

2020/01/15 02:59

> ラベルと画像を「組」にした と言っているけれども,何をもって「組」なのか. 何らかの「あれとこれとが組です」という関連性を示す情報があるならば,それを利用すればよいのでは.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問