0

ユーザー コントロールを各タブに動的に追加するタブ付きコントロールと、フォームの下部にある StatusStrip を持つフォームを作成しました。アプリが起動すると、セキュリティに基づいてユーザー コントロールがタブに読み込まれ、少なくとも 1 つのタブが読み込まれます。StatusStrip には、2 つの ToolStripComboBox、2 つの ToolStripButton、1 つの ToolStripLabel、および 1 つの ToolStripStatusLabel があります。すべてが正常にロードされ、機能します。

ユーザーが 2 つのボタンのいずれかを押すと、MonthCalendar ポップアップが表示されるようになりました。これを行うために使用するコードは次のとおりです。

If IsNothing(theCal) Then
    theCal = New MonthCalendar
    AddHandler theCal.DateSelected, AddressOf theCalDateSelected
    AddHandler theCal.LostFocus, AddressOf theCalLostFocus
    AddHandler theCal.GotFocus, AddressOf theCalLostFocus
    theCal.Parent = Me
    theCal.Top = StatusStripMain.Top - theCal.Height
    theCal.Left = ComboBoxAvailableLegDay.Bounds.X
    theCal.Anchor = AnchorStyles.Bottom + AnchorStyles.Left
    theCal.Show()
    theCal.BringToFront()
    theCal.Focus()
Else
    Me.Controls.Remove(theCal)
    theCal = Nothing
End If

theCal は、フォームのクラスの上部で Protected として定義されています。したがって、ボタンを押すと MonthCalendar が作成され、存在しない場合は正しく配置され、存在する場合は削除されます。これは問題なく動作します。

私の問題は、theCal が GotFocus または LostFocus を起動しないことです。次のように定義された theCalLostFocus プロシージャを取得しましたが、例外は発生しません。スローにブレークポイントを設定できますが、コードがそのポイントに到達することはありません。

Private Sub theCalLostFocus(ByVal sender As Object, ByVal e As EventArgs)
    Throw New NotImplementedException
End Sub

Cal の日付をクリックすると、CalDateSelected プロシージャが呼び出されますが、フォームの他の領域をクリックしても、CalLostFocus は呼び出されません。ユーザーは日付を選択したくない場合があり、ボタンを押して theCal を削除する必要がないようにするため、フォーカスを失ったときに theCal を削除できるようにしたいと考えています。なぜこれが起こっているのか誰にも分かりますか?解決策はありますか?

ありがとう。-NCGrimbo

4

1 に答える 1

1

ビジュアル ツリーにハンドラーを挿入するにハンドラーを追加するため、フォーカス イベントが発生しないことにそれほど驚かない。show() の呼び出しの後にハンドラーを追加してみてください。または、ロードされたイベントハンドラーで。フォーカスをリクエストすると、毎回フォーカス イベント ハンドラが呼び出されることに注意してください。

Rq : 書かれているように、theCal をクリアするときにイベント ハンドラーを削除しないため、コードにメモリ リークが発生します。したがって、theCal への参照が保持されるため、theCal もイベント ハンドラーもクリアされず、これがメモリ リーク (周期的) につながります。参照)。

于 2012-08-23T18:53:23.590 に答える