チェックボックスのイベントでエラーが出る。

タグの編集
投稿者 ビジャマ  (高校生) 投稿日時 2019/3/3 16:48:45
フォームのチェックボックスの初期値をデザイナでTrueにした場合、
これを動作させるとチェックボックスのCheckedChangedイベントで
「オブジェクト参照がオブジェクトインスタンスに設定されていません」というエラーが出ます。
確認してみると、フォームが開く前にCheckedChangedイベントが動いてしまっていて、
問題の変数の用意ができていない状態であることが分かりました。

そこで、

Private load_flg As Boolean = False

という変数を用意して、フォームがロードされたかどうかのフラグを用意し、
フォームのLoadイベントでload_flg = Trueにするようにしました。
また、チェックボックスのCheckedChangedイベントでは、load_flg = Trueの時だけ
イベント内の処理をするようにしました。
一応、これでエラーは出なくなったみたいですが、これは正しいやり方なのでしょうか?
もっと良い方法はないでしょうか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/3/4 12:23:34
> これを動作させるとチェックボックスのCheckedChangedイベントで
> 「オブジェクト参照がオブジェクトインスタンスに設定されていません」というエラーが出ます。
NullReferenceException というやつですね。
どのオブジェクトの参照が無いと言われていますか?


> フォームが開く前にCheckedChangedイベントが動いてしまっていて、
デザイン時に Checked プロパティを True にした場合、Load イベント発生前
(InitializeComponent メソッド呼び出し時)にイベントが呼び出されます。

このタイミングでは、CheckBox1 や Label1 等の各種コントロールは
既に生成されていますが、それらはまだフォームに貼り終える前であるため、
Me.Controls 等からのコントロール取得は行えない可能性があります。
TabControl を使っている場合は特に注意。


> これは正しいやり方なのでしょうか?

手順的にはそれで良いと思いますが、"load_flg" という名前だと、
True と False がそれぞれ何を意味しているかが後で見た時に分かりにくいので、私なら
 「Private IsLoaded As Boolean = False」 … ロードされたら Fasel → True となる
 「Private Initializing As Boolean = True」 … 初期化処理が終わった時に True → False となる
のように、True/False の意味を想像しやすい変数名にします。


あるいは、エラーの要因となっているオブジェクトが明らかである場合は、
そのオブジェクトを利用する前に、
 If 何某 IsNot Nothing Then
のような判定処理を入れるという対策もあります。

あとは、WithEvents を使わず、OnLoad メソッドや Load イベントにて
AddHandler するという手もありますが、今回のケースではフラグ判定で良いと思います。
投稿者 ビジャマ  (高校生) 投稿日時 2019/3/4 13:15:30
フラグを用いる方法がよいとのこと、ありがとうございました。
フラグ変数名はIsLoadedにします。何だかカッコいいです。
また、背景や他の方法も教えて頂き、ありがとうございました。
これからもよろしくお願いいたします。