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

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

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

Re[11]: イベントについて


(過去ログ 11 を表示中)

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

■2761 / inTopicNo.1)  イベントについて
  
□投稿者/ まきこ (1回)-(2007/04/16(Mon) 10:46:22)

分類:[C# (Windows)] 

C#で、あるコントロールにイベントが設定されているかどうかって確認できるのでしょうか?
イメージとしては下記のような処理をしたいと思っています。
if (this.comboBox1.SelectedIndexChanged == null) {}

引用返信 編集キー/
■2762 / inTopicNo.2)  Re[1]: イベントについて
□投稿者/ れれれ (23回)-(2007/04/16(Mon) 10:50:40)
No2761 (まきこ さん) に返信
> C#で、あるコントロールにイベントが設定されているかどうかって確認できるのでしょうか?
> イメージとしては下記のような処理をしたいと思っています。
> if (this.comboBox1.SelectedIndexChanged == null) {}
>
質問の意味を取り違えていたらごめんなさい
フォームデザインのところでcomboBox1をクリックしてそれのプロパティの中のイナズママークみたいなところをクリックするとイベントが確認できるのではないでしょうか?
引用返信 編集キー/
■2763 / inTopicNo.3)  Re[1]: イベントについて
□投稿者/ επιστημη (480回)-(2007/04/16(Mon) 11:08:46)
επιστημη さんの Web サイト
> C#で、あるコントロールにイベントが設定されているかどうかって確認できるのでしょうか?
> イメージとしては下記のような処理をしたいと思っています。
> if (this.comboBox1.SelectedIndexChanged == null) {}

これはエラー:「イベントは +=, -= の左辺にしか使えないよー」となりますね。
なにが目的でそんなことしたいのかしら? それによっては解決策が見つかるかも。

引用返信 編集キー/
■2764 / inTopicNo.4)  Re[2]: イベントについて
□投稿者/ ぽぴ王子 (179回)-(2007/04/16(Mon) 11:26:55)
ぽぴ王子 さんの Web サイト
No2762 (れれれ さん) に返信

> 質問の意味を取り違えていたらごめんなさい
> フォームデザインのところでcomboBox1をクリックしてそれのプロパティの中のイナズママークみたいなところをクリックするとイベントが確認できるのではないでしょうか?

これは「デザイナで確認する方法」だと思います。デザイン時に、かな。

まきこさんが知りたいのは、実行時に確認する方法なのではないかと。

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

> なにが目的でそんなことしたいのかしら? それによっては解決策が見つかるかも。

確かに。
やりたいことが何かが見えてくれば、イベントが設定されているかどうか以外に
解決策があるかもしれません。
「イベントが設定されているかどうか」に固執してしまうと、見えるものも見えなく
なったりするので、できれば目的を教えていただけると助かります。
引用返信 編集キー/
■2766 / inTopicNo.5)  Re[3]: イベントについて
□投稿者/ まきこ (2回)-(2007/04/16(Mon) 12:23:17)
皆さん、ご返信ありがとうございます。
イベントの有無の確認は実行時に行いたいと考えておりました。
コンボボックスをDropDownListで使用しているのですが、Itemが4つあり、その内容を
this.comboBox.Items[0] = "○○";
this.comboBox.Items[1] = "○○";
this.comboBox.Items[2] = "○○";
this.comboBox.Items[3] = "○○";
と変更したときにSelectedIndexが変わっていないにもSelectedIndexChangedの
イベントが起こって困りました。
そこで、イベントを一度消して、アイテムを追加した後にイベントを追加しようと考えました。
で、そのときにイベントが存在するかどうかを確認したかったのです。
フラグなどを持たせるなどで対応できるのですが、イベントの存在の有無の確認ができるのか?
ってことも気になったので皆さんにお聞きしました。


No2764 (ぽぴ王子 さん) に返信
> ■No2762 (れれれ さん) に返信
>
>>質問の意味を取り違えていたらごめんなさい
>>フォームデザインのところでcomboBox1をクリックしてそれのプロパティの中のイナズママークみたいなところをクリックするとイベントが確認できるのではないでしょうか?
>
> これは「デザイナで確認する方法」だと思います。デザイン時に、かな。
>
> まきこさんが知りたいのは、実行時に確認する方法なのではないかと。
>
> ■No2763 (επιστημη さん) に返信
>
>>なにが目的でそんなことしたいのかしら? それによっては解決策が見つかるかも。
>
> 確かに。
> やりたいことが何かが見えてくれば、イベントが設定されているかどうか以外に
> 解決策があるかもしれません。
> 「イベントが設定されているかどうか」に固執してしまうと、見えるものも見えなく
> なったりするので、できれば目的を教えていただけると助かります。
引用返信 編集キー/
■2772 / inTopicNo.6)  Re[1]: イベントについて
□投稿者/ 魔界の仮面弁士 (261回)-(2007/04/16(Mon) 13:27:06)
No2761 (まきこ さん) に返信
> イメージとしては下記のような処理をしたいと思っています。
> if (this.comboBox1.SelectedIndexChanged == null) {}

一応、こんな感じで判定できましたが……実用性は無いかも。


private void button1_Click(object sender, EventArgs e)
{
    Delegate[] methodList = GetCaller(comboBox1);
    StringBuilder sb = new StringBuilder("comboBox1 の SelectedIndexChanged イベントは未登録");
    if (methodList.Length > 0)
    {
        sb = new StringBuilder();
        foreach (Delegate method in methodList)
        {
            sb.AppendLine(method.Method.Name);
        }
    }
    MessageBox.Show(sb.ToString());
}

public Delegate[] GetCaller(ComboBox target)
{
    Type type = typeof(ComboBox);

    BindingFlags all = BindingFlags.Default;
    all |= BindingFlags.Public;
    all |= BindingFlags.NonPublic;
    all |= BindingFlags.Instance;
    all |= BindingFlags.IgnoreCase;
    all |= BindingFlags.Static;

    EventDescriptorCollection events = TypeDescriptor.GetEvents(target);
    EventDescriptor myEvent = events.Find("SelectedIndexChanged", false);
    MethodInfo mi = type.GetMethod("get_Events", all);
    EventHandlerList list = (EventHandlerList)mi.Invoke(target, new object[] { });
    FieldInfo fi = type.GetField("EVENT_SELECTEDINDEXCHANGED", all);
    object key = fi.GetValue(target);
    if (list[key] == null)
    {
        return new Delegate[0];
    }
    else
    {
        return list[key].GetInvocationList();
    }
}

引用返信 編集キー/
■2773 / inTopicNo.7)  Re[4]: イベントについて
□投稿者/ επιστημη (481回)-(2007/04/16(Mon) 13:27:42)
επιστημη さんの Web サイト
> SelectedIndexが変わっていないにもSelectedIndexChangedの
> イベントが起こって困りました。

前回のSelectedIndexをどっかに保持しておいて、
SelectedIndexChangedされたときに前回と変わったかを調べてはいかがでしょ?

引用返信 編集キー/
■2774 / inTopicNo.8)  Re[2]: イベントについて
□投稿者/ 囚人 (81回)-(2007/04/16(Mon) 13:38:23)
最初(コンストラクタとか)は無条件にイベントハンドラを追加しておいて、後は毎度削除してから追加すればいいと思いますよ。

comboBox.SelectedIndexChanged -= new EventHandler(comboBox_SelectedIndexChanged);
// 何か処理
comboBox.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged);


試してませんが
>と変更したときにSelectedIndexが変わっていないにもSelectedIndexChangedの
>イベントが起こって困りました。
で困る事自体が問題のような…。
引用返信 編集キー/
■2776 / inTopicNo.9)  Re[3]: イベントについて
□投稿者/ シャノン (130回)-(2007/04/16(Mon) 13:59:52)
シャノン さんの Web サイト
No2774 (囚人 さん) に返信

> 試してませんが
> >と変更したときにSelectedIndexが変わっていないにもSelectedIndexChangedの
> >イベントが起こって困りました。
> で困る事自体が問題のような…。

SelectedIndexが変わっていないにもSelectedIndexChangedのイベントが起こること自体が問題じゃねぇんですかね。


引用返信 編集キー/
■2779 / inTopicNo.10)  Re[4]: イベントについて
□投稿者/ επιστημη (482回)-(2007/04/16(Mon) 14:22:32)
επιστημη さんの Web サイト
> SelectedIndexが変わっていないにもSelectedIndexChangedのイベントが起こること自体が問題じゃねぇんですかね。

ちょこちょこっと書いて試してみた。
確かにItems[]を書き換えるとSelectedIndexChangedされるみたい。
Framwrork側のちょんぼ、だよねぇ。

引用返信 編集キー/
■2781 / inTopicNo.11)  Re[5]: イベントについて
□投稿者/ 中博俊 (1024回)-(2007/04/16(Mon) 15:06:20)
中博俊 さんの Web サイト
いえ。チェンジ系イベントは変化がなくても変化します。
aからaへの変化でも発生します。
だから今回の場合チェンジ系イベントが起きるからおかしくなる。ではなくチェンジ系イベントが発生しても良いように作っていないことが問題になります。

引用返信 編集キー/
■2783 / inTopicNo.12)  Re[6]: イベントについて
□投稿者/ επιστημη (483回)-(2007/04/16(Mon) 15:12:17)
επιστημη さんの Web サイト
> いえ。チェンジ系イベントは変化がなくても変化します。
> aからaへの変化でも発生します。

でもさでもさ、Items[]を書き換えた場合SelectedValueはchangedかもしれんけど、
SelectedIndexがなんで変化したことになるん?

# 「そー決めたから」って返されるとぐぅの音も出ませんが ^^;

引用返信 編集キー/
■2785 / inTopicNo.13)  Re[6]: イベントについて
□投稿者/ 中博俊 (1025回)-(2007/04/16(Mon) 15:51:06)
中博俊 さんの Web サイト
それ以前にSelectedIndexは正常でない値を示すことがあって、SelectedValueを仕使えっていうことになってます。
何れもWindowsのコモンコントロールに昔から潜む問題
引用返信 編集キー/
■2786 / inTopicNo.14)  Re[7]: イベントについて
□投稿者/ シャノン (132回)-(2007/04/16(Mon) 16:27:15)
シャノン さんの Web サイト
No2785 (中博俊 さん) に返信
> 何れもWindowsのコモンコントロールに昔から潜む問題

それを直すべきでしょ? と提言したい。
今は今の仕様に従うしかないとしても。
引用返信 編集キー/
■2788 / inTopicNo.15)  Re[7]: イベントについて
□投稿者/ Hirotow (82回)-(2007/04/16(Mon) 16:45:30)
Hirotow さんの Web サイト
> 何れもWindowsのコモンコントロールに昔から潜む問題
たしか結構有名なバグだったような。

引用返信 編集キー/
■2789 / inTopicNo.16)  Re[8]: イベントについて
□投稿者/ επιστημη (484回)-(2007/04/16(Mon) 16:49:45)
επιστημη さんの Web サイト
>>何れもWindowsのコモンコントロールに昔から潜む問題
> たしか結構有名なバグだったような。

今更改修かけると余計に混乱するっ なんてな判断で"いじらない"つもりかな?
# でもねー、Frameworkは「ちゃんと」動いてくれていいぢゃない、ねぇ。

引用返信 編集キー/
■2797 / inTopicNo.17)  Re[8]: イベントについて
□投稿者/ 渋木宏明(ひどり) (184回)-(2007/04/16(Mon) 18:55:48)
渋木宏明(ひどり) さんの Web サイト
> それを直すべきでしょ? と提言したい。
> 今は今の仕様に従うしかないとしても。

16bit Windows からのしがらみなんだろうから、もはや手のつけようが無いんじゃない?

引用返信 編集キー/
■2798 / inTopicNo.18)  Re[9]: イベントについて
□投稿者/ とっちゃん (109回)-(2007/04/16(Mon) 18:55:57)
とっちゃん さんの Web サイト
No2789 (επιστημη さん) に返信
> >>何れもWindowsのコモンコントロールに昔から潜む問題
>>たしか結構有名なバグだったような。
>
チョー有名なバグです。
ってか、Windows 3.0 の時点では既にあったんで、もっと前からあるんじゃなかろうかとw

なので、CBN_SELCHANGE でひろわずに、CBN_SELENDOK で
チェックしないとダメなんですよねぇw<Nativeコントロールのコンボボックス

コンボの CBN_SELCHANGE は、選択状態の変更のためにあるのではなくて、
オーナードローでの画面リフレッシュ用にあるのとほぼ同義なので仕様的に
今の作りをかえられても、やっぱり困るわけですがw
#拡張スタイルも関係なしですw

> 今更改修かけると余計に混乱するっ なんてな判断で"いじらない"つもりかな?
> # でもねー、Frameworkは「ちゃんと」動いてくれていいぢゃない、ねぇ。
>
ま、netfx がそこまでストレートにトレースしてどうする?というのはあるんですがねw
こっちは、設計ミスではなかろうかと...w

引用返信 編集キー/
■2800 / inTopicNo.19)  Re[10]: イベントについて
□投稿者/ シャノン (134回)-(2007/04/16(Mon) 19:14:42)
シャノン さんの Web サイト
No2798 (とっちゃん さん) に返信
> チョー有名なバグです。
> ってか、Windows 3.0 の時点では既にあったんで、もっと前からあるんじゃなかろうかとw

絶句。
それなら 95 なり NT3.1 なりのタイミングで直せただろうに。

> ま、netfx がそこまでストレートにトレースしてどうする?というのはあるんですがねw
> こっちは、設計ミスではなかろうかと...w

そそ。
直ってないなら SelectedIndexChanged なんてイベント作るなよとか、MSDN に書いとけよとか。
有名なバグって言う割に俺は知らなかったわけですが、どこを調べれば載ってますか?
MSDN オンラインの CBN_SELCHANGE のページにさえ、それらしき内容は見当たりませんけど。

http://msdn2.microsoft.com/en-us/library/ms673136.aspx

#WPF では直ってるんだろうな…
引用返信 編集キー/
■2801 / inTopicNo.20)  Re[7]: イベントについて
 
□投稿者/ シャノン (135回)-(2007/04/16(Mon) 19:25:49)
シャノン さんの Web サイト
No2783 (επιστημη さん) に返信
>>いえ。チェンジ系イベントは変化がなくても変化します。
>>aからaへの変化でも発生します。
>
> でもさでもさ、Items[]を書き換えた場合SelectedValueはchangedかもしれんけど、
> SelectedIndexがなんで変化したことになるん?

今調べてみたら、Win32 にはそもそも、コンボボックスのアイテムを差し替える機能がない。
Items[ n ] = ○○; は、一旦削除してから再挿入してやがる。
その過程で SelectedIndexChanged が発生するのかもしれない(未検証。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -