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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

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

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

5257閲覧

RemoveHandler~,AddressOf~でイベントの発生を抑止できなくなった。

oribe

総合スコア17

Visual Studio

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

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/02/19 08:07

[VB.NET]既存のコードではRemoveHandlerでイベントの発生を抑止できていたが、改修後に抑止できなくなった。試しに二行書くと抑止できた。

VB.NET、Visual StudioでWindowsフォームアプリの保守・改修をおこなっています。

改修前のコードでは何ら問題もなく

RemoveHandler combobox.SelectedIndexChanged, AddressOf combobox_SelectedIndexChanged 'comboBoxのSelectedIndexChangedイベントが発生する処理 AddHandler combobox.SelectedIndexChanged, AddressOf combobox_SelectedIndexChanged

でイベントの発生を抑止できていました。

今回、上記とは全く関係のない部分(と思われます)箇所を修正したのでテストすると、上記箇所でイベントが発生しており抑止できていないことが判明しました。
試しにコピペして

RemoveHandler combobox.SelectedIndexChanged, AddressOf combobox_SelectedIndexChanged RemoveHandler combobox.SelectedIndexChanged, AddressOf combobox_SelectedIndexChanged 'comboBoxのSelectedIndexChangedイベントが発生する処理 AddHandler combobox.SelectedIndexChanged, AddressOf combobox_SelectedIndexChanged

二行書くとイベントの発生を抑止できました。
上記の対応では個人的に納得できません。

改修に何らかの原因があると思われますが、何をどう調べればよいのかそのヒントすら分かりません。
直接or間接の原因や怪しいと思われる要因などをご教授いただけないでしょうか?
よろしくお願いします。

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

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

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

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

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

Zuishin

2020/02/19 08:28

ソリューションの全ソースから RemoveHandler を検索してコメントアウトし、イベントの付け外しをやめ、フラグで管理してログをとってみてください。
oribe

2020/02/20 02:10

提案をありがとうございます。 システム内にもフラグを設定してイベント処理をExitしている箇所が多々あります。 現状を調査中ですので、また改めて返信します。
oribe

2020/03/02 01:10

結果として今回はZuishinさんのご提言で回避することとしました。 ベストアンサーを差し上げたいのですが回答扱いになっておらず、それができません。 どうすればよいでしょうか?
guest

回答2

0

改修したことによって、combobox_SelectedIndexChangedハンドラーが2個追加されているのではないでしょうか。RemoveHandlerを1回呼ぶだけでは足らず、

上記箇所でイベントが発生しており抑止できていない

つまり、combobox_SelectedIndexChangedハンドラーが依然として呼ばれる。
2回呼べば空になって、再度のAddHandlerで1個追加されて、動く。

改修箇所を再度チェックしてみてください。

投稿2020/02/19 08:27

dodox86

総合スコア9183

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

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

oribe

2020/02/20 02:17

以下のサンプルコードで再現できました。 Private Sub Form1_Load( sender As System.Object, e As System.EventArgs) Handles MyBase.Load ComboBox1.Items.Add("AAA") ComboBox1.Items.Add("BBB") RemoveHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged ComboBox1.SelectedIndex = 0 AddHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged AddHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged RemoveHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged ComboBox1.SelectedIndex = 1 AddHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged End Sub ソースを見直し&デバッグしていますが、RemoveHandlerとAddHandlerは対になっており、AddHandlerのみ余計におこなわれているとは見かけ上考えにくいのです。 引き続き調査します。
oribe

2020/02/20 02:23

取り急ぎ回答をありがとうございます。
dodox86

2020/02/20 02:29

Form_Load()での再現コードですか? RemoveHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged まず、もともと無いところにRemoveHandler で0個。 AddHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged AddHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged ここで+2個。 RemoveHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged ここで-1個、残り1個。 AddHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged ここで+1個、残り2個 ではないですか?
oribe

2020/03/02 00:55

返信が遅くなり申し訳ありません。 先にも述べましたがコード上はRemoveHandlerとAddHandlerは一対となっており、AddHandlerのみ余計に行われていることはデバッグでも確認できませんでした。 調査を続行したかったのですが時間的な制約があったため、改修工数が少ないZuishinさんご提言のフラグを設定して回避することとしました。 dodox86さんのご回答も非常にためになりました。 ありがとうございます。 結果としてZuishinさんをベストアンサーとしました。 ご了承くださいますようお願い申しあげると共に今後ともよろしくお願いいたします。
dodox86

2020/03/02 02:36

> 結果としてZuishinさんをベストアンサーとしました。 > ご了承くださいますようお願い そのこと自体は別に良いと思いますし、私自身に特に異存は無いのですが、質問はクローズ(解決済み)とすべきですので、「Zuishinさんご提示のフラグを使用する案で解決しました」旨の自己回答をして、質問を閉じましょう。
oribe

2020/03/02 02:47

度々、ありがとうございます。
guest

0

自己解決

Zuishinさんご提示のフラグを使用する案で解決しました。

投稿2020/03/02 02:47

oribe

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問