Top / .NET備忘録 / 01.TextBox / 02.TextChanged イベント

VB6.0 のソースをアップグレードウィザードにかけるといくつかの気になるコメントが書き込まれます。

その中のひとつに「〜.TextChanged は、フォームが初期化されたときに発生します。」というのがあります。

デザイナが生成する InitializeComponent() メソッド実行中に Text プロパティへ値をセットすると、TextChanged イベントが発生します。

何が問題かというと、イベント中に、他のコントロールを参照したり、DBにアクセスするようなコードがあると、異常終了してしまいます。

Microsoft の Web ページでは、Form 側を書き換える方法が紹介されているのですが、これをコントロール側で実装するにはどうしたらよいでしょうか?

ハンドルが作成されたときでいいんじゃないか?→Visible = false のときは作成されないようだ。とかいろいろ思案した結果、FindForm の戻り値を見ることにしました。

どうやら FindForm の戻り値は InitializeComponent() メソッド実行中は null になっているようです。

OnTextChanged メソッドをオーバーライドして処理します。

    // FindForm() が null 以外のものを返すまで TextChange イベントは起こさない
    private bool m_IsFindForm = false;
  
    // イベントは new する
    public new event EventHandler TextChanged;
  
    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        if (!m_IsFindForm) m_IsFindForm = (FindForm() != null);
        if (m_IsFindForm && TextChanged != null) TextChanged(this, e);
    }

後日談

ISupportInitialize を実装すれば、デザイナが BeginInit/EndInit の呼び出しを生成してくれます。
EndInit の中で、フラグを ON すればOKですね。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-03-05 (火) 03:29:04 (1692d)