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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

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

Q&A

解決済

1回答

3419閲覧

C#のClickイベントハンドラのパラメータ EventArgs型であるe.Xの値を取得したいです。

aya5kishi

総合スコア8

C#

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

0グッド

1クリップ

投稿2021/12/17 13:44

編集2021/12/17 15:02

前提・実現したいこと

C#のClickイベントハンドラのパラメータである、EventArgs型e.Xの値を取得したいです。

デバッグをするとEventArgs型のe.Xには、int型の47という値が入っているようですが、
値を取得するために「int a = e.X;」と記述してもエラーとなってしまいます。
何が問題なのでしょうか。教えていただけますでしょうか。

イメージ説明

★★★
// 追記
EventArgsクラスを調べたところ、get/setがありませんでした。
そもそもEventArgsクラスにはXという値が格納されていないのでしょうか?
もし、EventArgsクラスにXという値が格納されていないのなら、デバッグ上で表示されていた
int型の47という値はどこからプログラム上で参照して利用することができるのでしょうか?
ご教授いただけると幸いです。
イメージ説明

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

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

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

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

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

YAmaGNZ

2021/12/17 14:09

引数の型が違います。 リファレンスを確認しましょう。
aya5kishi

2021/12/17 14:14

引数というのは、button1_Clickの仮引数である「EventArgs e 」のことでしょうか?
Zuishin

2021/12/17 15:10

コピペ縛りで計算機を作ってる人か。
aya5kishi

2021/12/17 15:16

計算機?に「EventArgs e 」が利用されているという意味でしょうか?
退会済みユーザー

退会済みユーザー

2021/12/18 02:47

質問の上の画像で e の「種類」を見ると System.EventArgs {System.Windows.Forms.MouseEventArgs} となっているはずで、確かに Click イベントのハンドラの引数 e には MouseEventArgs が渡されているようです。でもそれが書いてある Microsoft の公式ドキュメントが見つかりません。逆に、その EventArgs は "it only indicates that a click has occurred. (クリックが発生したことを示すにすぎません)" と書いてあるのですが・・・
aya5kishi

2021/12/18 04:56

確かに、MicrosoftサイトのControl.Click Eventには、「クリックが発生したことを示すだけ」としか書かれておらず、謎ですね。 マウスがクリックされたから、引数 e には MouseEventArgsが渡されていた(スーパークラスの型であるEventArgs型の仮引数に代入)と勝手に自分の中で納得していましたが、公式ドキュメントに書かれていない推測で納得していた自分に反省です。 どなたか引数 e にMouseEventArgsが渡される理由がわかるドキュメントをご存じの方はいらっしゃるでしょうか? この質問を新しくteratail上に挙げたほうが良いでしょうか?
Zuishin

2021/12/18 05:06

EventArgs はマウスクリックイベントで作られたものが使いまわされているだけでしょう。ただしドキュメントされていないのであれば、いつ仕様変更があるかはわからないため、これを使ってはいけません。 Click イベントの代わりに MouseClick イベントをハンドルするのが良いと思います。
退会済みユーザー

退会済みユーザー

2021/12/18 05:16 編集

上の私のレスが言葉足らずだったようです。「Control.Click イベントのハンドラで MouseEventArgs が取得できる」と明記されている公式ドキュメントが見つけられない限りはたまたまそうなっているだけで、将来書いてある通り「クリックが発生したことを示すにすぎません(マウス情報は取得できなくなる)」になるかもしれない。なので、 subly さんが言われるように「マウス情報が必要な場合は、MouseClickイベントを使用する」のが良さそうということも言いたかったのです。 そもそも Button.Click イベントでマウス情報が必要なことは普通はなさそうだと思うのですが。
guest

回答1

0

ベストアンサー

Control.Click Event
MSDNによるとマウス情報が必要な場合は、MouseClickイベントを使用するようです。

デバッグ上でXが表示されていたのは、eにはEventArgsを継承した
MouseEventArgsが渡されているからです(e.ToString()するとわかります)。

しかし、MouseEventArgsとしてではなく、EventArgs型で渡されているため、

C#

1int a = e.X;

としてもビルドエラーがでてしまいます。

C#

1int a = ((MouseEventArgs)e).X;

MouseEventArgsにキャストするとビルドエラーは出なくなります。

投稿2021/12/17 15:54

編集2021/12/17 15:55
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aya5kishi

2021/12/17 16:02 編集

ありがとうございます。無事にエラーがなくなり、エラー原因も理解することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問