vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: KeyNotFoundExeption in abgeleiteter Klasse 
Autor: Manfred X
Datum: 21.10.10 15:53

Hallo!

Kann man das Ganze nicht einfach dadurch lösen, dass
Du aus Albumstruct eine Klasse machst(*) und bei der
Initialisierung einer neuen Instanz (Konstruktor) bei der
entsprechenden Eigenschaft "[Leer]" einträgst,
sowie beim Versuch der Zuweisung eines String durch
"String.IsNullOrWhiteSpace" prüfst, ob eine Angabe
vorhanden ist und, falls nicht, diese Eigenschaft
re-initialisierst.


(*) falls Albumstruct nicht bereits eine Klasse ist ...

MfG
Manfred

Beitrag wurde zuletzt am 21.10.10 um 15:59:19 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

KeyNotFoundExeption in abgeleiteter Klasse 
Autor: Schü
Datum: 21.10.10 13:18

Hallo!

Habe eine abgeleitete Klasse von System.Collections.Generic.SortedDictionary(Of String, AlbumStruct)
Dort möchte ich eigentlich die Add und die Remove-Methoden überschreiben. Offensichtlich Falsch von mir gemacht!
Der Clou ist, dass bei einem Leeren sAlbumName der Schlüssel ''Leer'' erzeugt/abgefragt wird.


Friend Class SortedAlbumStruct
        Inherits System.Collections.Generic.SortedDictionary(Of String, _
          AlbumStruct)
 
        Default Public Overloads ReadOnly Property Item(ByVal Index As Integer) _
          As AlbumStruct
            Get
                Try
                    Return MyBase.Item(Keys(Index))
                Catch
                    Throw New IndexOutOfRangeException
                End Try
            End Get
        End Property
 
        Default Public Overloads ReadOnly Property Item(ByVal sAlbumName As _
          String) As AlbumStruct
            Get
                Try
                    If sAlbumName = "" Then sAlbumName = "[Leer]"
                    Debug.Print(MyBase.Count.ToString)
                    Return MyBase.Item(sAlbumName)   '---> Fehler: 
                    ' KeyNotFounmdExeption!
                Catch
                    Throw New IndexOutOfRangeException
                End Try
            End Get
        End Property
 
        Public ReadOnly Property Items() As String()
            Get
                Dim Res(Keys.Count - 1) As String
                Me.Keys.CopyTo(Res, 0)
                Return Res
            End Get
        End Property
 
        Public Shadows Sub Add(ByVal sAlbumName As String, ByVal iNr As Integer)
            If _Vorschau Is Nothing OrElse _Vorschau.Items.Count < 1 Then Exit _
              Sub
 
            If sAlbumName = "" Then sAlbumName = "[Leer]"
 
            If Not Me.ContainsKey(sAlbumName) Then
                Dim X As New AlbumStruct
                X.Add(iNr)
                MyBase.Add(sAlbumName, X)
            Else
                Dim X As AlbumStruct = MyBase.Item(sAlbumName)
                X.Add(iNr)
            End If
 
            Debug.Print(MyBase.Count.ToString)
        End Sub
 
        Public Shadows Function Remove(ByVal sAlbumName As String) As Boolean
            If sAlbumName = "" Then sAlbumName = "[Leer]"
 
            If Not Me.ContainsKey(sAlbumName) Then Return True
            Return MyBase.Remove(sAlbumName)
        End Function
    End Class
Wenn ich nun diese Klasse erstelle und ein Element mit einem leeren String anlege, tritt dabei kein Fehler auf. Nur wenn ich dann .Item("") abfrage tritt ein Fehler auf.

Ich habe schon lange gesucht, aber nichts gefunden.
Bei der Add-Methode wird nach dem Hinzufügen korrekt eine Anzahl von 1 ausgegeben.
Bei der Abfrage dann über Item(sAlbumName) aber ist MyBase.count auf einmal 0!!
Jemand eine Idee?

Achja, die Klasse AlbumStruct könnte genausogut zum Test ein Integer oder String sein.
Die eigentliche Klasse AlbumStruct ist sehr Komplex.
(Windows XP, Framework 4.0)

Schü

Beitrag wurde zuletzt am 21.10.10 um 13:18:34 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: KeyNotFoundExeption in abgeleiteter Klasse 
Autor: Maas
Datum: 21.10.10 18:35

Offtopic:
Du solltest auf gar keinen Fall alle Exceptions mit Standard-TryCatch abfangen und dann daraus eine IndexOutOfRangeException machen. Nicht alle Exceptions sind IndexOutOfRange. Kann natürlich sein, dass SortedDictionary.Item nur diese Exception schmeisst (steht in der Doku welche das dann wären), aber dann würde das Ganze gar keinen Sinn machen. Also so oder so: weg mit dem TryCatch. Das ist nur eine Quelle mehr, die für Verwirrung sorgt.

Ansonsten schließe ich mich ManfredX an. Wieso keine Konstruktor-Lösung? Ein Konstruktor geht auch bei Structures, außer dass der Standard-Konstruktor immer existiert, aber eine Klasse wäre schon besser.

Es gilt außerdem die Regel, dass Structures klein zu halten sind (ich glaube maximal 8KB/B? Verbrauch im Speicher pro Instanz). Das liegt daran, dass bei Structures keine Referenz bei einer Variablenzuweisung erstellt wird, sondern eine neue Instanz. (imho) Google mal nach Stack, Heap, Value-Type und Reference-Type. (Mein Wissen ist dahingehend auch nicht so besonders, also besser nachrecherchieren).
Wenn deine Structure also sehr groß ist, solltest du sie allein schon deswegen in eine Klasse umwandeln.

Maas
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: KeyNotFoundExeption in abgeleiteter Klasse 
Autor: Schü
Datum: 21.10.10 20:00

Ups,

ich weiss im Moment gar nicht, ob Ihr mich richtig verstanden habt.
AlbumStruct ist eine Klasse (Struct ist sicherlich irreführend!).

Das mit dem Abfangen des Fehlers im Try Catch ... OK stimmt. Sollte man lassen.

Als ich schrieb, dass AlbumStruct auch ein String sein könne, meinte ich, dass ich die Klasse AlbumStruct nicht posten wollte, sondern Ihr solltet anstatt AlbumStruct einfach einen String oder so was einfügen, damit der Code läuft. Ich meinte z.B. folgendes:

Public Class AlbumStruct
   Public iNr as Integer
   Public Name as string
End Class
Aber: Ich möchte den Nullstring in der Klasse abfangen. Dafür sind Propertys da. Sonst hätte ich alle Klassenvariablen einfach mit Public deklarieren können.
Mein Problem ist aber, dass beim Hinzufügen mittels .Add() das Element in MyBase korrekt eingefügt wird, aber bei der Abfrage über .Item() dann plötzlich MyBase.Count=0 ist. Daher tritt KeyNotFoundExeption auf.


Schü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel