フォームデザイナーがエラーで開かない

タグの編集
投稿者 しまも  (社会人) 投稿日時 2023/3/8 18:01:08
前に「拡張メソッドが突然エラーに」(http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30833)の質問をした者です。
その節は丁寧に教えていただきありがとうございました。

おかげさまでエラーは解決し、レビューで指摘いただいた点を順次直したり、作成の続きを進めていたのですが、
その後、いくつかのフォームをフォームデザイナーで開こうとすると、
次のようなエラーが出て開けなくなってしまいました。

--------------------------------------------------------------------------------------------------
× データが失われる可能性を防ぐため、デザイナーの読み込み前に以下のエラーを解決する必要があります。
× 1個のエラー 無視して続行する ?このページが表示されている理由

× オブジェクト参照がオブジェクトインスタンスに設定されていません。

このエラーのインスタンス(1)
1.コールスタックの表示
--------------------------------------------------------------------------------------------------

「エラー一覧」にも、「オブジェクトインスタンスに設定されていません。」というメッセージが出ています。

すべてのフォームでこうなるわけではなく、デザイナーを開けるフォームもあります。

また、プログラムを動かすことはできています。

今回も何をどうしたらいいのかさっぱりわからず途方に暮れていまして、
お助けいただけたら幸いです。

いちおう、前と同様にコードとエラーメッセージのスクショを提示いたします。
https://1drv.ms/u/s!AhdkuT50ikIxgiAMvbxGodTD7OAX?e=Zxh8Eo
投稿者 shu  (社会人) 投稿日時 2023/3/9 00:51:37
初期化処理でデザイン時に実行できない処理を行っているとか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/9 09:45:54
デザイナに表示されている 「1。 コール スタックの表示」 をクリックしたときに
下記のエラーメッセージが現れることには気づいていますか?

場所 VocabularyBuilder.LanguageSelector.get_Value()
場所 C:\Users\user\source\repos\VocabularyBuilder\VocabularyBuilder\CustomControls\LanguageSelector.vb:行 8
 

VocabularyBuilder プロジェクトの CustomControls\LanguageSelector.vb を開いてみると
該当箇所は、Value As Language プロパティの getter であることがわかります。


その 8 行目には『Return DirectCast(tagValue, Language)』とあります。

この時、tagValue As Object の値が Nothing であるため、
Enum Language への DirectCast が失敗している、という状況です。

エラーメッセージを読み解くことができていれば、ひとまずここまでは辿りつけるかと思います。
具体的に、そのコードの何が問題であったのか…という点は、別投稿にしておきます。
投稿者 (削除されました)  () 投稿日時 2023/3/9 11:56:51
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/9 20:08:16
> この時、tagValue As Object の値が Nothing であるため、
> Enum Language への DirectCast が失敗している、という状況です。

Dim tagValue As Object = Nothing
Return DirectCast(tagValue, Language)  'InvalidCastException 



LanguageSelector.vb のデザイン画面を見てみると、
初期状態で Checked = True な RadioButton がありませんので、
Value プロパティの getter の下記の処理が失敗します。
Dim tagValue = (From rb In Me.GroupBox1.Controls.OfType(Of RadioButton)
                Where rb.Checked Select rb.Tag).FirstOrDefault
Return DirectCast(tagValue, Language)


常に何かが選択された状態にしておきたいのであれば、
事前に rbEnglish の Checked を True にしておくのが良いでしょう。

あるいはどれも選択されていない、という状態を表したいのであれば、
Language.None を返すようにしておくとか。
(その場合は、SelectChanged メソッドも改修が必要ですね)

Return (From rb In GroupBox1.Controls.OfType(Of RadioButton)()
          Where rb.Checked Select DirectCast(rb.Tag, Language)
          ).DefaultIfEmpty(Language.None).SingleOrDefault()
投稿者 しまも  (社会人) 投稿日時 2023/3/19 10:04:28
遅くなり失礼しました。ご教示いただいたとおり直せました。ありがとうございました!