web-dev-qa-db-ja.com

Form.Loadイベントが発生せず、フォームが表示される

コードに明らかに問題があるのではないかと心配していますが、フォームを作成して表示したときに_Form.Load_イベントが発生しない状況に遭遇しました。

フォームがサブクラス化されておらず(一部の検索で問題が発生したため)、デバッガーでコードをステップ実行してもエラーがスローされません。

IDEが作成したフォームロード関数(_Handles MyBase.Load_署名サフィックスが付いています)にブレークポイントを設定していますが、ブレークポイントに到達せず、フォームが表示されて機能します。

フォームにはコンストラクタで3つの引数が渡されますが、IntializeComponent()関数は、他の処理が行われる前に呼び出されます。

コード:

_Public Sub New(ByVal argA As Object, ByVal argB As Object, ByVal mode As FormMode)

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    ' Other code here,
    ' No errors generated
    '

End Sub
_

フォームロード関数は次のとおりです(ただし、イベントが発生しないため、実際には実行されません)。

コード:

_Private Sub frmInstrumentEditor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not argA Is Nothing Then ' argA set in constructor
          ' Operations using argA
    End If
End Sub
_

いくつかのコントロールとargAオブジェクトでいくつかのデータバインディングを使用していると追加する場合がありますが、これがエラーを生成している場合、私はこれを見たと思います(デバッガー>例外ウィンドウでCLR実行設定をThownに設定しています) )

なぜこれが起こっているのでしょうか?

16
ChrisAU

私は同様の問題を抱えていました(それはShownではなくLoadイベントにありましたが、根本的な原因は同じです)。理由は祖先の1つに深く隠されていました-未処理のNullReferenceExceptionがスローされ、この例外はどういうわけか「ミュート」されていました。

F11を使用した広範囲にわたるデバッグの後にそれを見つけました。

しかし...この答えを書いているとき、私はこれを見つけました SOへの投稿

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)メソッドにMain()を追加するだけです。

64ビットマシンを使用している場合は、ソリューションが提供されます(私の場合も機能しました)。

28

同様の問題がありました。フォームを初めて開いたときは、ロードイベントはトリガーされませんが、2回目に開いたときは問題ありません。問題は、データベースから削除したフィールドにバインドされているテキストボックスの1つであることが判明しました(SQLサーバー-かなり標準的な方法でデータセット、テーブルアダプター、バインディングソースを使用していました)。

データバインドされているフォーム上のすべてのコントロールにデータセット内に存在するフィールドがあり、データセットが基になるデータベーステーブルを正確に反映していることを確認します(この最後のビットを実行するのが最も簡単だったのは、データソースウィンドウ(メニュー-data-データソースを表示)の[ウィザード]ボタンをクリックし、テーブルを削除します。次に、それを再度使用してテーブルを追加します。これにより、すべてのデータが一致するようになります。

お役に立てれば。

7
John Whiting

OK私は同じ問題を抱えていました(私はそう思います)と、ここでの手がかりが助けになりました。それは(一種の)データバインディングでした

設定にバインドされたいくつかのコントロールのプロパティがあり、これらの設定を削除すると、フォームロードイベントが実行を停止しました。バインディングを削除し、再び実行されます。

4
polychromenz

同様の問題がありましたが、問題はデータバインディングの誤りでした。データバインディングのコードを省略して、試してみてください。ロードイベントハンドラーがヒットすると思います。次に、データバインディング部分の何が問題かを確認します。

1
Amr

解決しました..。

4時間を費やして、ついにこの答えから手がかりを得ました。私の場合、フォームにいくつかのTextBoxコントロールがそれぞれの列を持つBindingSourceにバインドされていましたが、フォームにはまだそのbindingsourceがありますが、基になるデータベーステーブルから1つの列を削除したため、フォームにはまだ1つありますTextBoxはbindingsourceを使用してその列を指して存在しますが、実際に削除したのでそのような列はありません!.....このリードForm.loadイベントが発生していなかった........最終的には修正されました。

あなた方全員に感謝します ..

1
Coder

同じ問題があった。データバインディングを確認したところ、すべて問題ないように見えました。フォームが閉じられていても、.NETが確かではなかったと考えました(昔は、フォームが非表示になっていて、実際には閉じられていなかったことがあります)。

イベントハンドラーFormClosedを追加して、1行挿入しました。

Private Sub frmScheduleInquiry_FormClosed(sender As Object, e As   System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    Me.Dispose()
End Sub

問題が解決しました!

1
ccampj

ここに別のアイデアがあります。

(CLRだけでなく)すべての例外タイプを、ユーザーが処理しない代わりにスローするように設定するとどうなりますか。アプリケーションはどこかで壊れますか?

また、再確認するために、デバッグモードになっていますか?

1
Matt

あなたのウィンドウフォームはベースページを継承していますか?もしそうなら、ベースページはおそらくフォームロードイベントハンドラも持っています。その基本ページのForm Loadイベントハンドラーで、スローされている例外を見つけます。したがって、ベースページフォームロードイベントハンドラーを終了し、継承されたウィンドウフォームでフォームロードイベントハンドラーを起動していません。

1
Bubba

発生している問題は、「その他のコード」を実行する前に、アプリケーションがフォームを完全にロードする必要があることが原因である可能性があります。これは、読み込みが完了していないフォーム上のオブジェクトを処理する他のコードが原因である可能性があります。ロード機能で有効になるタイマーを使用して、他のコードを実行できます。このようにすると、タイミングの問題が発生せず、最初にフォームをロードしてから、後で2番目に分割して、タイマーから必要なコードを実行できます。

1
Matt

まったく同じ問題が発生しました。いくつかのApplicationsSettingsプロパティをフォームのTextBoxコントロールに追加したことがわかりましたが、後でそれらを削除したいと考えました。私はthoughtすべてをクリアしましたが、明らかにクリアしませんでした。これがForm_Load()(および他のイベントも同様)を起動させなかった原因です。問題のあるTextBoxを削除してから再度追加することでうまくいきました。

お役に立てれば

1
user3765883

マットはおそらくこれについて正しいでしょう。次のようにコードを調整してみましたか?

Private Sub frmInstrumentEditor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not argA Is Nothing Then ' argA set in constructor
      ' Operations using argA
Else
      MessageBox.Show("argA has not been set")
End If
End Sub

メッセージボックスが表示される場合は、引数が初期化される前にイベントが発生したことを意味します。フォームを閉じる/開くことに関する「奇妙な」動作も説明します。

「Shown」イベントでargA操作を実行してみましたか?

0
Geoffrey

私はこれが古い投稿であることを知っていますが、誰かがこの問題を検索している場合は、この問題に対する私の修正が役立つかもしれないと思いました。

最初に投稿した質問で述べたのと同じ問題がありましたが、フォームにデータバインドフィールドがありませんでした。問題は、私がCurrentDeployment.CurrentVersionメソッドを使用していて、それがサイレント問題の原因であることが原因であることがわかりました。アプリケーションをデバッグモードからリリースに設定しましたが、問題はまだ存在していました。試行錯誤を繰り返しながら、定義方法Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersionとプレストを書き直しました。これで通常どおり機能します。

元のコードを以下のコードに変更してしまいました。

    Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion
    sysVersion = String.Format("{0}.{1}{2}.{3}", xVersion.Major, xVersion.Minor, xVersion.Build, xVersion.Revision)

新しいコード

#If (DEBUG) Then
    sysVersion = "[Debug mode]"
#Else
    Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion
    sysVersion = String.Format("{0}.{1}{2}.{3}", xVersion.Major, xVersion.Minor, xVersion.Build, xVersion.Revision)
#End If

これが誰かの役に立つことを願っています。ハッピーコーディング...

0
Lynn

一連の古いアセンブリ(.NET 2.0; .NET 1.1)をロードした.NET 4.0 WinFormsアプリケーションをビルドして実行したときに、この症状が発生しました。

過去に、これが混合モードのアセンブリ例外を引き起こすのを見ました。この特定のケースでは、メインフォームは例外なく読み込まれ、そのフォームロードコードは実行されません。

私の場合、解決策はuseLegacyV2RuntimeActivationPolicy="true"をApp.configドキュメントに追加します。

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
0
El-Ahrairah

IDE=の上部にある[ソリューション構成]ボックスに「デバッグ」と表示されていることを確認してください。「リリース」と表示されている場合、「ロード」メソッドがデバッガーによってキャプチャされていないことがわかりました。

0
craisin

これが役立つかどうかはわかりませんが、誰かが誤ってHandles Me.Loadを削除したため、この問題が発生しました。 MyBase.LoadがMe.Loadに変更してみてください。

0
Hans

同じ問題、私はデザイナーを書き直し、それを修正しました。デザイナーがロードしてからクラッシュしましたが(当然ながら無音)、form_loadが原因で起動していませんでした。

0
Rob

同じ問題がありましたが、原因はまったく異なりました。フォームはform.ShowDialog()ではなくform.Show()を使用して表示されていました

0
syonip

同様の問題がありました。フォームでShowメソッドを使用しておらず、代わりにuser32.dll ShowWindow呼び出しを使用していることがわかりました。つまり、フォームはまだ表示されていますが、dotNet Showメソッドが呼び出されなかったため、Loadイベントは発生しませんでした。

0
Nick Wallace