FormをDisposeせずにShowDialogをした場合、FormLoadがShowDialogの度に呼ばれる。

588 views
Skip to first unread message

masatakashibuya

unread,
Apr 9, 2019, 5:32:48 AM4/9/19
to OpenTouryoProject
西野さん

お世話になっております。渋谷です。

BaseControllerWinを継承したFormをShowDialogしCloseした後も、Disposeを呼ばずに使いまわしたいのですが。
ShowDialogの度にFormLoadが呼ばれるため、

テンプレートのMyBaseControllerWinの
UOC_CMNFormInitでaddControlEventが複数回呼ばれてしまいます。

addControlEventを移動したいのですが
どこが適切でしょうか。

よろしくお願いします。
Message has been deleted

daisukenishino

unread,
Apr 9, 2019, 7:08:52 AM4/9/19
to OpenTouryoProject
渋谷さん

最近、話題の teratail.com に以下の様な投稿がありました。

C# - C#, EventHandlerの多重登録回避について教えてください。|teratail
https://teratail.com/questions/111336

イベントの2重登録はGUIアプリの割と一般的な問題らしく、
jQueryや、Vueでも同じようなトラブルシュートのFAQを確認できます。

ちょっと悩んでみましたが、

this.button1.Clickに既設のイベントハンドラがあるかどうか?
をチェックできないようなので、以下の様に、
マイナス(-=)した後にプラス(+=)にする方法で
書き直したら上手く行かないでしょうか?

        private void Form1_Load(object sender, EventArgs e)
        {
            this.button1.Click -= new System.EventHandler(this.button_Click);
            this.button1.Click += new System.EventHandler(this.button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
        }

動作確認してみましたが、
イベントハンドラが設定されていない状態で、
マイナス(-=)しても、エラーにはならないようです。
(MyBaseControllerWinのカスタマイズを想定しています)

ただ、

            // コントロール検索&イベントハンドラ設定
            RcMyCmnFunction.GetCtrlAndSetClickEventHandler2(this, this.MyCreatePrefixAndEvtHndHt(), this.ControlHt);

の部分の修正が大変そうなので、
MyBaseControllerWinにインスタンス・メンバ変数にフラグを追加して、
一度、addControlEventが呼ばれたら、以降スキップすると良いかも知れません。


  /// <summary>イベント追加処理フラグ</summary>
  private bool IsInitializedEvent = false;

  /// <summary>イベント追加処理</summary>
  private void addControlEvent()
  {
    if(!this.IsInitializedEvent)
    {
      this.IsInitializedEvent = true;
      ...
    }
  }


西野




2019年4月9日火曜日 18時32分48秒 UTC+9 masatakashibuya:

masatakashibuya

unread,
Apr 9, 2019, 9:31:34 PM4/9/19
to OpenTouryoProject
西野さん

このあたりもスキップする必要がありました。

FormのClose時に、初期化処理を行う方向で考えてみました。
UOC_CMNFormEndに、イベントハンドラを削除する処理とLstUserControl・ControlHtといったリストを初期化する処理を追加しました。

の削除版みたいな感じです。
// ハンドラをキャストして削除
button.Click -= (EventHandler)eventHandler;
controlHt.Remove(ctrl.Name);

うまく動いているようです。

2019年4月9日火曜日 20時08分52秒 UTC+9 daisukenishino:

daisukenishino

unread,
Apr 10, 2019, 10:27:53 PM4/10/19
to OpenTouryoProject
渋谷さん

BaseControllerWin.cs

に修正が必要ということだと
「カスタマイズ可能な部位」
ではないので一般ユーザにとって問題ですね。

これは、issueに登録しておきます。

西野


2019年4月10日水曜日 10時31分34秒 UTC+9 masatakashibuya:

daisukenishino

unread,
Apr 18, 2019, 8:57:32 PM4/18/19
to OpenTouryoProject
渋谷さん

この案件は、v02-40を使用している案件でしょうか?
(若しくは、v02-40へのアップグレードがかのうでしょうか?)

もし、そうなら、NuGetパッケージをアップデートしようと思います。

02-40のテンプレートがLatest version: 2.4.2を使用しているので、

新しく、Touryo.Infrastructure.Framework.RichClientを更新して、2.4.3として登録する。

西野
Reply all
Reply to author
Forward
0 new messages