Probleme mit eigener List(of Klasse) - VB.NET

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Probleme mit eigener List(of Klasse) - VB.NET

    Hallo Zusammen. Ich bin neu hier und benötige eure Hilfe.

    Ich habe eine Klasse GraphKonfig erstellt, in der ich eine Liste mit Werten und die zum Graphen zugehörige Farbe hinterlegen möchte.

    VB.NET-Quellcode

    1. Public Class CLS_GraphKonfig
    2. Private _Farbe As System.Drawing.Brush
    3. Private _Werte As List(Of Integer)
    4. Public Sub New(farbe As System.Drawing.Brush, werte As List(Of Integer))
    5. _Farbe = farbe
    6. _Werte = werte
    7. End Sub
    8. End Class



    Im Form1_Load erstelle ich eine neue Liste mit Werten die vom Typ Integer sind und erstelle danach eine neue Liste vom Typ der Klasse CLS_GraphKonfig und möchte gerne die Farbe sowie die Liste mit Werten dieser Klasse übergeben. Ich benötige die Klasse GraphKonfig um den Graphen später mehrere Eigenschaften (Farbe, Bezeichnungen o.ä.) zuordnen zu können.
    Nachdem dies getan ist, möchte ich meinem UserControl11 die Liste vom Typ CLS_GraphKonfig übergeben, damit mein Graph im Diagramm gezeichnet wird. Hier habe ich allerdings noch Probleme mit der Übergabe der Liste an das Control.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim Werte As New List(Of Integer)
    4. Werte .Add(750)
    5. Werte .Add(500)
    6. Werte .Add(1000)
    7. Werte .Add(250)
    8. Werte .Add(0)
    9. Dim g As New List(Of CLS_GraphKonfig)
    10. g.Add(New CLS_GraphKonfig(Brushes.Black, Werte))
    11. ' Dieser Teil funktioniert noch nicht wie gewünscht:
    12. UserControl11.Kurven.Add(g)
    13. End Class


    Das UserControl soll nachher ein Diagramm mit verschiedenen Graphen zeichnen können.
    Hier habe ich allerdings noch Probleme :(

    VB.NET-Quellcode

    1. Public Class UserControl1
    2. Public Kurven as New List(Of CLS_GraphKonfig)
    3. Private Sub Paint(ByVal sender as Object, ByVAl e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    4. zeichneGraphen(e.Graphics, Kurven)
    5. End Sub
    6. Private Sub zeichneGraphen(ByVal g As Graphics, liste as List(Of CLS_GraphKonfig))
    7. ...
    8. With g
    9. stift = liste.Item(FARBE) ' Hier möchte ich gerne die Farbe aus der Liste dem Stift zuweisen!?
    10. ...
    11. For Each wert in liste.Item(WERTE) ' Hier möchte ich gerne auf die Werte der Liste zugreifen um den Graphen im Diagramm zeichnen zu können.
    12. .DrawLine(stift, New Drawing.Point(wert, 10)...)
    13. Next
    14. End With
    15. End Sub
    16. End Class


    Ich hoffe Ihr könnt mir weiterhelfen und bitte seid Nachsichtig mit mir.

    LG
    Kurz und knapp: Du hast UserControl11.Kurven.Add(g) misverstanden.

    Das Feld Kurven aus dem UserControl1 ist bereits vom Typ List(Of T). Das hat in der Tat eine Add-Methode, die du aufzurufen versuchst.
    Und jetzt tust du mir einen Gefallen: platziere den Cursor in deinem Code über dem Wort Add und drücke F1. Was erwartet die Methode als Parameter-Typ? List(Of CLS_GraphKonfig) oder CLS_GraphKonfig?

    Was für einen Typ hat g? List(Of CLS_GraphKonfig) oder CLS_GraphKonfig?

    Wenn du diese beiden Fragen sicher beantworten kannst, hast du dein Problem schon so gut wie gelöst.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    *Bitte keine unnötigen Vollzitate*

    Add erwartet => CLS_GraphKonfig

    und g ist vom Typ => List(Of CLS_GraphKonfig)

    Okay ...

    Ich habs jetzt so umgeschrieben!

    VB.NET-Quellcode

    1. Dim g as New CLS_GraphKonfig(Brushes.Black, Werte)
    2. Usercontrol11.Kurven.Add(g)


    Das UserControl1.vb sieht jetzt so aus:

    VB.NET-Quellcode

    1. Public Class UserControl1
    2. Public Kurven as New List(Of CLS_GraphKonfig)
    3. Private Sub Paint(ByVal sender as Object, ByVAl e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    4. zeichneGraphen(e.Graphics, Kurven)
    5. End Sub
    6. Private Sub zeichneGraphen(ByVal g As Graphics, liste as List(Of CLS_GraphKonfig))
    7. Dim anzahlGraphen as Integer = liste.count()
    8. ...
    9. With g
    10. For j as Integer = 0 To anzahlGraphen - 1
    11. For Each element in liste.Item(j).Werte
    12. ' Hiermit erhalte ich für jeden Graphen die vordefinierte Farbe:
    13. stift = new Pen(liste.item(j).Farbe, 2)
    14. ...
    15. .DrawLine(stift, New Drawing.Point(element, 10)...)
    16. ...
    17. Next
    18. Next
    19. End With
    20. End Sub
    21. End Class



    Zudem habe ich die Klasse CLS_GraphKonfig um 2 ReadOnly Properties erweitert um auf die Farbe und die Listen zugreifen zu können:

    VB.NET-Quellcode

    1. Public Class CLS_GraphKonfig
    2. Private _Farbe As System.Drawing.Brush
    3. Private _Werte As List(Of Integer)
    4. Public Sub New(farbe As System.Drawing.Brush, werte As List(Of Integer))
    5. _Farbe = farbe
    6. _Werte = werte
    7. End Sub
    8. ReadOnly Property Farbe As System.Drawing.Brush
    9. Get
    10. Return _Farbe
    11. End Get
    12. End Property
    13. ReadOnly Property Werte As List(Of Integer)
    14. Get
    15. Return _Werte
    16. End Get
    17. End Property
    18. End Class


    Kann oder muss man das so machen mit den Properties um auf die Farben und Werte zugreifen zu können?
    Also so wie es jetzt ist funktioniert es wunderbar.
    Vielen Dank an Arby für die Hinweise :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()