2017-02-08 3 views
0

Ich schreibe ein Programm zum Füllen einer TXT-Vorlage Datei mit Werten durch Ersetzen von Platzhaltern. Die Werte stammen aus einem Excel-Dokument. Ich lese eine Map-Datei, die Zeile für Zeile 3 Werte enthält; ein Subheader in Excel, der Elementname und der Platzhalter. Diese Werte werden in 3 Arrays platziert und dann zu einem Multi-Key-Wörterbuch kombiniert.vb.net löschen Multi-Key-Wörterbuch

Ich möchte das Programm mehrmals ausführen können, ohne es zu schließen, also muss ich das Wörterbuch löschen, nachdem es fertig ist, damit ich es wieder ausführen kann. Ich konnte nicht löschen mit .clear() und nicht sicher, warum. Es funktioniert, wenn ich es löschen und dann den Inhalt in der gleichen Untergruppe auflisten, aber nicht, wenn ich es in einer Untergruppe lösche und dann versuche, sie in einer anderen Untereinheit zu verwenden. Ich deklariere das Wörterbuch auf Klassenebene und benutze es in mehreren Subs/Funktionen.

'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 

Dies ist, wie ich das Wörterbuch

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 

Ich versuchte vor kurzem erklärt, es in einer separaten Klasse bevölkern sind, aber wissen nicht, wie/deaktivieren Sie die Klasse schließen und dann neu deklarieren.

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 

Danke !!

+0

getan Sie sagen, dass es nicht funktioniert, wenn Sie das Wörterbuch aus einer anderen Methode versuchen und verwenden ... Was genau meinst du durch funktioniert nicht? Exception Details bitte ... Failing alles, objDict.DISspose(), gefolgt von objDict = New DIctionary (von ObkKey, String) sollte den Job erledigen ... –

+0

@MartinMilan, würden Sie denken, würden Sie nicht. Aber aus irgendeinem Grund, der nur Microsoft bekannt ist ... haben Wörterbücher keine Dispose-Methode. –

+0

Welche Ausnahme erhalten Sie? Was ist los? –

Antwort

0

Wenn Sie eine solche Klasse verwenden, fügen Sie am besten iDisposable hinzu.

Und nicht shared .... es macht die Daten über alle Instanzen geteilt.

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 

Wenn Sie mit ihm einfachen Aufruf der dispose-Methode

GB.Dispose