2017-02-08 2 views
0

プレースホルダを置き換えることによって.txtテンプレートファイルに値を設定するプログラムを作成しています。値はExcelドキュメントから得られます。 私は、行ごとに3つの値を含むマップファイルを読んでいます。 Excelのサブヘッダ、要素名、およびプレースホルダー。これらの値は3つの配列に配置され、次に複数キーの辞書に結合されます。vb.net clear multi-key dictionary

プログラムを終了することなく何度も実行できるようにしたいので、実行が終了した後に辞書をクリアして、再度実行する必要があります。私は.clear()を使用してクリアすることができず、理由を確認できませんでした。 それは私がそれをクリアし、同じサブにコンテンツを一覧表示するが、私は1つのサブでそれをクリアし、別のサブでそれを使用しようとしないときに動作します。 私は、クラスレベルで辞書を宣言し、それを複数のサブ/関数で使用しています。

'Dictionary 
Dim ObjDict As New Dictionary(Of ObjKey, String) 

Structure ObjKey 
    Public CIQ_Obj_Key As String 
    Public CIQ_Sec_Key As String 
    Public YAML_Tag_Key As String 
End Structure 

これは私が最近、別々のクラスでそれを宣言しようとしたが、それをクラスを閉じて再度宣言/クリアする方法がわからない、私は辞書に

Do Until xx = RowUpperBound 

    If xlWorkSheet.Cells(xx, ObjHeaderColInt).Value = CIQ_Obj_Txt Then 
     'MsgBox("Found " & CIQ_Obj_Txt & " in row " & xx) 
     XlCell = CType(xlWorkSheet.Cells(xx, ValHeaderColInt), excel.Range) 
     If IsNothing(XlCell.Value2) Then 
      Write_Error_("No value found for " & CIQ_Obj_Txt & " at row " & xx) 
     Else 
      CellStr = XlCell.Value2.ToString.Trim 
      TxtBxDebugBox.Text += "Found " & CIQ_Obj_Txt & ": " & CellStr & " at " & xx & vbNewLine 
      GlobalVariables.ObjDict.Add(New GlobalVariables.ObjKey() With {.CIQ_Obj_Key = CIQ_Obj_Txt, 
                     .CIQ_Sec_Key = CIQ_Sec_Txt, 
                    .YAML_Tag_Key = YAML_Tag_Txt}, CellStr) 
     End If 
      Exit Do 
    ElseIf xx = (RowUpperBound - 1) Then 
      Write_Error_("Cannot find " & CIQ_Obj_Txt & " under " & CIQ_Sec_Txt) 
      Exit Do 
    End If 
     xx += 1 
Loop 

に移入されている方法です。

Public Class GlobalVariables 
Public Shared ObjDict As New Dictionary(Of ObjKey, String) 

Structure ObjKey 
    Public CIQ_Obj_Key As String 
    Public CIQ_Sec_Key As String 
    Public YAML_Tag_Key As String 
End Structure 

End Class 

ありがとう!!

+0

が終わったら...あなたは正確に何を意味するのかbyはうまくいかない?例外の詳細をしてください...失敗したすべて、objDict.DIspose()の後にobjDict =新しいDIctionary(ObkKey、Stringの)は仕事をする必要があります... –

+0

@MartinMilan、あなたはそう思わないでしょう。しかし、Microsoftにしか知られていない何らかの理由で...辞書にはDisposeメソッドがありません。 –

+0

何の例外がありますか?何が起こっている? –

答えて

0

このようなクラスを使用している場合は、iDisposableサポートを追加することをお勧めします。

共有を使用しないでください....すべてのインスタンスでデータを共有します。

Private GB as GlobalVatiables 

Public Class GlobalVariables 
    Implements IDisposable 

    Public ObjDict As New Dictionary(Of ObjKey, String) 

    Structure ObjKey 
     Public CIQ_Obj_Key As String 
     Public CIQ_Sec_Key As String 
     Public YAML_Tag_Key As String 
    End Structure 

    Private disposedValue As Boolean ' To detect redundant calls 

    ' IDisposable 
    Protected Overridable Sub Dispose(disposing As Boolean) 
     If Not Me.disposedValue Then 
      If disposing Then 
       ' TODO: dispose managed state (managed objects). 
       ObjDict.Clear() 
       ObjDict = Nothing 
      End If 

      ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below. 
      ' TODO: set large fields to null. 
     End If 
     Me.disposedValue = True 
    End Sub 

    ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources. 
    'Protected Overrides Sub Finalize() 
    ' ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
    ' Dispose(False) 
    ' MyBase.Finalize() 
    'End Sub 

    ' This code added by Visual Basic to correctly implement the disposable pattern. 
    Public Sub Dispose() Implements IDisposable.Dispose 
     ' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above. 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 

End Class 

あなたは、あなたが別の方法から辞書を試してみて、使用するとき、それは動作しませんと言って、単純な呼び出しDisposeメソッド

GB.Dispose