1

ツリービューコントロールを使用して特定のフォームを表示しようとしています。そのノードのtag値は、表示する必要のあるフォームのインスタンスに設定されています。DoubleClickイベントにあるコードは、フォームを初めて表示するとうまく機能しますが、その後、オブジェクトが破棄された例外が発生します。ご覧のとおり、タグをリセットして処理してみましたが、うまくいきませんでした。例外が発生してタグを正しいタイプのフォームにリセットするたびにswitchステートメントを実行せずにフォームを複数回表示できる方法はありますか?フォームの表示方法に似た、より良いものが欲しいのですが。

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim fm2 As New Form2()
        Dim fm3 As New Form3()
        TreeView1.Nodes(0).Tag = fm2
        TreeView1.Nodes(1).Tag = fm3
    End Sub

    Private Sub TreeView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView1.DoubleClick
        Try
            CType(TreeView1.SelectedNode.Tag, Form).Show()
        Catch odex As ObjectDisposedException
            TreeView1.SelectedNode.Tag = New Form()
            TreeView1_DoubleClick(sender, e)
        Catch nrex As NullReferenceException
            'No node selected, do nothing.  
        End Try
    End Sub
End Class
4

2 に答える 2

1

フォームは、ユーザーが閉じたときに破棄されます。1つのオプションは、フォームのClosingイベントを処理し、閉じるのではなく非表示にすることです。

于 2010-06-03T19:05:04.697 に答える
1

ここでの問題は、ユーザーがフォームを閉じると、オブジェクトが破棄されることです。

これを処理する方法はいくつかありますが、いくつかは他の方法よりもエレガントです。

  1. この時点でFormX_Closed()のハンドラーを追加すると、タグ参照をリセットできます
  2. 「ダイアログの表示」プロセスに切り替えて、DoubleClick()メソッドが終了する前にリセットすることができます

それは本当にこれらのフォームが何をしているかに依存します。通常、DoubleClickメソッドがルックアップを実行してからインスタンスを作成します。これは、インスタンスを作成する場合、必要のないメモリを使用しているためですが、アプリケーションを考慮すると必要になる場合があります。

ルックアップの例

コメントで要求されているように、これを別の方法で行う場合は、列挙値、またはタグに単純な整数の「キー」値を使用します。次に、次のようなものを作成して表示します。

Select Case myTag
    Case 1
        Dim formInstance As New Form1()
        formInstance.Show()
    Case Else
        Dim formInstance As New Form2()
        formInstance.Show()
End Select

基本的にそれを一元化し、オンデマンドでフォームを起動します。より詳細な制御が必要な場合、または多くの異なるフォームタイプがある場合は、これを別のデザインパターンに切り替えることができます。

于 2010-06-03T19:05:23.817 に答える