C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: Object型の型判定


(過去ログ 55 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■30939 / inTopicNo.1)  Object型の型判定
  
□投稿者/ たつ (6回)-(2009/01/09(Fri) 15:59:04)

分類:[C#] 

お世話になります。

MenuStripとContextMenuStripがあり、それぞれに「終了(X)」メニューを
つけました。
終了処理はどちらも同じなので、同一のイベントを呼ぶようにしました。
ですが、その処理の中で一部どちらの「終了」が押されたのかによって
多少処理を変えたいため判定をしたいのです。

senderの型を判定すれば良いだけとは思うのですが、以下ではどちらの場合も
「メインメニュー」となってしまいます。


private void EndProc(object sender, EventArgs e)
{
    // どちらの「終了」が押されたか判定
    if (sender is ContextMenuStrip)
        MessageBox.Show("コンテキストメニュー");

    else
        MessageBox.Show("メインメニュー");

    // 終了処理
              :
              :
}

どのようにすれば型の判定が出来るのでしょうか?
宜しくお願い致します。

引用返信 編集キー/
■30942 / inTopicNo.2)  Re[1]: Object型の型判定
□投稿者/ 囚人 (310回)-(2009/01/09(Fri) 16:06:08)
デバッガで止めて sender の型を調べたら、両者で型の違いがわかると思いますよ。
でも、単純にイベントハンドラを2つ書いて両方から「終了処理」という共通メソッド呼んだ方が単純だと思いますけどね。

引用返信 編集キー/
■30943 / inTopicNo.3)  Re[1]: Object型の型判定
□投稿者/ επιστημη (1502回)-(2009/01/09(Fri) 16:08:41)
επιστημη さんの Web サイト
> どのようにすれば型の判定が出来るのでしょうか?

双方のTagに異なる値を割り当てといて、そいつで判断するてのはいかがでしょ。

引用返信 編集キー/
■30946 / inTopicNo.4)  Re[2]: Object型の型判定
□投稿者/ たつ (7回)-(2009/01/09(Fri) 16:45:53)
レスありがとうございます。


No30942 (囚人 さん) に返信
> デバッガで止めて sender の型を調べたら、両者で型の違いがわかると思いますよ。

ウォッチで「型」の部分が隠れてて、見落としてました。
ここで初めて気がついたのは、どちらも「ToolStripMenuItem」と言う型でした。
今まで見ていなかったので、「MenuStrip」「ContextMenuStrip」と言う型であろうと
思い込んでました。
型が違うのであれば、最初のやり方(isを使う)で良かったのですね。


> でも、単純にイベントハンドラを2つ書いて両方から「終了処理」という共通メソッド呼んだ方が単純だと思いますけどね。

最初はそうやっていたのですが、
勉強がてら今回のような事をやってみようと思いまして。
確かにそちらの方が単純ですよね。

No30943 (επιστημη さん) に返信

> 双方のTagに異なる値を割り当てといて、そいつで判断するてのはいかがでしょ。

(επιστημηさんはどちらも「ToolStripMenuItem」と言う型であるのを
見越して回答頂いたのでしょうか?(^^;))

早速プロパティに設定して実行してみたのですが、
Tagの中身がnullになってしまいます。


private void AppEnd_Proc(object sender, EventArgs e)
{
string strTag = strTag = ((ToolStripMenuItem)sender).Tag.ToString();

if (String.Compare(strTag, "Main") == 0)
MessageBox.Show("メインメニュー!");
else
MessageBox.Show("コンテキストメニュー!");
        :
:
}

すみません。何が悪いのかもう少しだけお教えいただけますか?

引用返信 編集キー/
■30948 / inTopicNo.5)  Re[3]: Object型の型判定
□投稿者/ みきぬ (329回)-(2009/01/09(Fri) 16:55:27)
ContextMenuStrip や、MenuStrip の Tag プロパティに設定してもだめですよ。
その中にある、個々の ToolStripMenuItem に対して設定しないと。
引用返信 編集キー/
■30950 / inTopicNo.6)  Re[4]: Object型の型判定
□投稿者/ たつ (9回)-(2009/01/09(Fri) 16:59:27)
No30948 (みきぬ さん) に返信
> ContextMenuStrip や、MenuStrip の Tag プロパティに設定してもだめですよ。
> その中にある、個々の ToolStripMenuItem に対して設定しないと。

その通りです。お恥ずかしい限りですorz。

無事判定する事が出来ました。
皆さんありがとうございました。



解決済み
引用返信 編集キー/
■30951 / inTopicNo.7)  Re[3]: Object型の型判定
□投稿者/ επιστημη (1503回)-(2009/01/09(Fri) 17:00:39)
επιστημη さんの Web サイト
2009/01/09(Fri) 17:01:36 編集(投稿者)

> 早速プロパティに設定して実行してみたのですが、
> Tagの中身がnullになってしまいます。

てことは、Tag.ToString() でNullRef例外ですね?

> すみません。何が悪いのかもう少しだけお教えいただけますか?

すみません。再現できません。どっちのTag値も正しく取得できました。

# あれますれちがい。再現できないワケだ^^;

解決済み
引用返信 編集キー/
■30954 / inTopicNo.8)  Re[1]: Object型の型判定
□投稿者/ biac (10回)-(2009/01/09(Fri) 17:29:37)
biac さんの Web サイト
No30939 (たつ さん) に返信
> MenuStripとContextMenuStripがあり、それぞれに「終了(X)」メニューを
> つけました。

> if (sender is ContextMenuStrip)

is 演算子のリファレンスを見てください。
http://msdn.microsoft.com/ja-jp/library/scekt9xw.aspx
/*
is 式は、指定した式が null 以外であり、指定したオブジェクトを指定した型に例外がスローされることなくキャストできる場合に、true と評価されます。
*/

型が同じとき true、 ではなく、 キャスト可能なら true、 です。

継承関係を確認していませんが、 MenuStrip は ContextMenuStrip にキャスト可能なんじゃないでしょうか。
厳密に型を比較したいときは、 GetType() して Equals() で判定した方がいいですよ。
引用返信 編集キー/
■30955 / inTopicNo.9)  Re[3]: Object型の型判定
□投稿者/ biac (11回)-(2009/01/09(Fri) 17:32:01)
biac さんの Web サイト
No30946 (たつ さん) に返信
> ここで初めて気がついたのは、どちらも「ToolStripMenuItem」と言う型でした。

ぅっわ〜、そゆことか。 恥ずかし… orz

> 型が違うのであれば、最初のやり方(isを使う)で良かったのですね。

や、 それはさっき書いたように、 要注意ですよ f(^^;
引用返信 編集キー/
■30960 / inTopicNo.10)  Re[4]: Object型の型判定
□投稿者/ たつ (10回)-(2009/01/09(Fri) 18:16:51)
No30955 (biac さん) に返信

解決後にも関わらず、貴重な情報ありがとう御座います!
いつかは教えられる側に回れるよう精進致します。

引用返信 編集キー/
■30961 / inTopicNo.11)  Re[5]: Object型の型判定
□投稿者/ たつ (11回)-(2009/01/09(Fri) 18:17:37)
あ。解決後の追記の場合もチェックしないと
外されてしまうんですね。

失礼しました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -