- PR -

UserControlのLoadイベントの動きについて

1
投稿者投稿内容
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-12-21 18:12
いつもお世話になっております。こんです。
すいません。いつもいつもですみませんが、また一つ質問させてください。

現在、FormにUserControlをAddしています。そして、UserControlにはデザイナでActiveXのコンポーネントを3つ貼り付けています。
(某地図製品のActiveXコントロール)

この時、デザイナが自動生成するInitializeComponent()の中に
以下のような文があるのですが、

this.Load += new System.EventHandler(this.UserControl1_Load);((System.ComponentModel.ISupportInitialize)(this.axMap1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.axMap2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.axMap3)).EndInit();

このEndInit()が呼び出されるたびにUserControl1_Load()が
呼び出されてしまいます。

これは、正しい動作なのでしょうか?

呼び出し側は以下のような感じです。

UserControl1 user = new UserControl1();
this.Controls.Add(user);

ちなみに、Formに貼り付けた場合はApplication.Run()が走った時
一度呼ばれるだけです。又、FlexGrid2.0のグリッドを貼り付けた時も
同じような文が生成されるのですがこの時もLoad()は一回呼ばれるだけです。

申し訳ありませんがここらへんの仕組みを教えて頂けたらありがたいです。
よろしくおねがいいたします。
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-12-21 18:28
すいません。捕捉させてください。

もしかすると、その製品固有とか言われるかも知れないですので。。。
ごめんなさい!

一般的にコントロールに他のコンポーネントを貼り付けて
そのコンポーネントに対して初期化終了を送ると
Loadハンドラが呼ばれるのは正しいのでしょうか?という所が知りたいです。

Loadハンドラが呼ばれるタイミングはMSDNだと最初に表示される時と書いてましたので
コントロールのVisibleの初期値をfalseにしたのですが同じでした。

ちなみにActiveXだとそうなるとかなんでもいいので情報頂けたらありがたいです。

よろしくお願いします。
スズキ
会議室デビュー日: 2007/08/13
投稿数: 2
投稿日時: 2007-08-13 11:50
いつもお世話になっております。
スズキです。

この問題について何か解決されていれば情報を
展開していただけるとありがたいです。

まさにこんさんと同じ問題に遭遇しています。
おそらく、『某地図製品』も同じものを使用
しているのではと思っております。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-08-13 15:08
回答ではありません。

UserControl の Load イベントを呼び出しているのは、
同じく UserControl の OnLoad メソッドです。
このメソッドは protected ですので、通常は外から呼び出すことはできません。
OnLoad は OnCreateControl から呼び出されています。
そして、OnCreateControl は・・・・?
通常はフォームが生成されて初めて表示される流れの中でこのような処理が行われています。


その ActiveX コントロールは ISupportInitialize インターフェースを実装しているようですが、
EndInit 時に何が行われているかはそのコントロールに依存します。
OnCreateControl を呼び出させてしまうような何かを行っているのだと思います。

メーカーに問い合わせるのがよいのではないでしょうか。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-08-13 15:19
この現象が回避できないものであった場合には、
フラグフィールドを持たせて初回だけ実行するようにするなどしてはいかがでしょうか。

private void UserControl_OnLoad (object sender, EventArgs e) {
if ( m_IsProcessedOnLoad ) { return; }
// 行いたい処理
m_IsProcessedOnLoad = true;
}
private bool m_IsProcessedOnLoad;

Load イベントはいつおこるのかが直感的に分かりづらい面もありますし、
インスタンス生成時に行ってもよい処理であれば、
コンストラクタで行ったほうがすっきりするかもしれませんね。
Load されていないために不正な動作を引き起こしてしまったということもなくなります。

個人的には、
「初期化処理は Load で」というのは避けたほうがよいのではないかと思います。
もちろん内容によっては Load のほうがよいものも多いですが。
スズキ
会議室デビュー日: 2007/08/13
投稿数: 2
投稿日時: 2007-08-13 15:47
masaさん
アドバイスありがとうございます。

技術的に未熟なため、EndInit時にUserControl の Load イベントが
走ってしまうことだけは分かったのですが、loadイベントを呼び出す
流れまでは知りませんでした。勉強になりました。

とりあえず、「なぜ、loadイベントが望んでいないタイミングで発生
するか」はメーカーに問い合わせてみることにし、今はコンストラク
タで初期化処理を実装することで問題を回避しています。

Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-08-13 15:55
こんにちは。

UserControlのLoadイベントが貼り付けているActiveXの数だけ呼び出される件、
.NET Frameworkの問題(である可能性が高い?)であって、
ActiveXのメーカーではないと思いますよ。
Microsoftに問い合わせたほうがよいのでは?
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-08-13 17:44
引用:

Tdnr_Symさんの書き込み (2007-08-13 15:55) より:
こんにちは。

UserControlのLoadイベントが貼り付けているActiveXの数だけ呼び出される件、
.NET Frameworkの問題(である可能性が高い?)であって、
ActiveXのメーカーではないと思いますよ。
Microsoftに問い合わせたほうがよいのでは?




そうなんですね。

> ちなみに、Formに貼り付けた場合はApplication.Run()が走った時
> 一度呼ばれるだけです。又、FlexGrid2.0のグリッドを貼り付けた時も
> 同じような文が生成されるのですがこの時もLoad()は一回呼ばれるだけです。

とあったので、その ActiveX 固有のものなのかと思ってしまいました。
FlexGrid2.0 は Form に貼り付けたということでしょうか。

1

スキルアップ/キャリアアップ(JOB@IT)