Shared zugriffe

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ByteHD.

    Shared zugriffe

    Hallo liebe Community!

    Ich möchte gerne aus den Shared Functions auf die Variable database zugreifen ohne eine Instanz von ihr zu erstellen. Geht das?
    Ich bin noch ein Anfänger in VB. Danke schon mal im Voraus!

    VB.NET-Quellcode

    1. Public Class Variable
    2. Shared database As New System.Windows.Forms.ListView
    3. Shared Function initVar()
    4. database.Items.Add("ss")
    5. database.Items.Item("ss").Text = "a"
    6. Return True
    7. End Function
    8. Shared Function addVar(name As String, value As String)
    9. database.Items.Add(name)
    10. database.Items.Item(name).Text = value
    11. Return True
    12. End Function
    13. End Class

    ByteHD schrieb:

    Geht das?
    Zunächst machst Du Option Strict On.
    Dann sagt Dir der VB-Compiler, dass Deine Funktionen einen Typ haben müssen:

    VB.NET-Quellcode

    1. Public Class Variable
    2. Shared database As New System.Windows.Forms.ListView
    3. Shared Function initVar() As Boolean
    4. database.Items.Add("ss")
    5. database.Items.Item("ss").Text = "a"
    6. Return True
    7. End Function
    8. Shared Function addVar(name As String, value As String) As Boolean
    9. database.Items.Add(name)
    10. database.Items.Item(name).Text = value
    11. Return True
    12. End Function
    13. End Class
    Andererseits: Wenn Deine Funktionen eh nur ein True zurückgeben, kannst Du das auch sparen:

    VB.NET-Quellcode

    1. Public Class Variable
    2. Shared database As New System.Windows.Forms.ListView
    3. Shared Sub initVar()
    4. database.Items.Add("ss")
    5. database.Items.Item("ss").Text = "a"
    6. End Sub
    7. Shared Sub addVar(name As String, value As String)
    8. database.Items.Add(name)
    9. database.Items.Item(name).Text = value
    10. End Sub
    11. End Class
    Aufrufen kannst Du das dann mit

    VB.NET-Quellcode

    1. Variable.InitVar()
    2. ' bzw.
    3. Variable.addVar("bla", "blub")
    Ansonsten ist es suboptimal, ein ListView als "Datenbank" zu missbrauchen.
    Nimm eine DataTable und hänge die dann als DataSource an ein DataGridView.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    nutze nicht das ListView als Datenspeicher, sondern eine Liste - z.B. System.ComponentModel.BindingList(Of T) - und reagiere auf Änderungen in der Liste. Die vorgeschlagene BindingList stellt hierfür ein Ereignis bereit, das bei einer Änderung auftritt.
    Steuerelemente werden nur dazu benutzt, Daten anzuzeigen. Ein Modell, das in Windows Forms genutzt wird, ist die Datenbindung. Steuerelemente, wie ListBox, DataGridView oder ComboBox verfügen über die Möglichkeit, direkt Listen anzuzeigen und auf Änderungen in ihnen zu reagieren. ListView besitzt diese Möglichkeit nicht von Haus aus.

    Am besten suchst du einfach mal ein paar Tutorials raus, die dir zeigen, wie du das machen kannst.
    Wenn du nicht auf das ListView verzichten kannst/willst, abonniere einfach das angesprochene BindingList.ListChanged-Ereignis und reagiere auf die Änderungen, die durch den e-Parameter des Ereignisses gezeigt werden. Wenn du zudem noch das System.ComponentModel.INotifyPropertyChanged implementierst und es entsprechend handhabst (auch hier wieder ein Tutorial suchen oder hier im Forum schauen, es gibt eine ganze Menge Beiträge dazu), kannst du bspw. database.Items.Item(name).Text elegant ersetzen. Es empfiehlt sich auf jeden Fall, eine eigene Klasse einzubauen, die deine Daten pro Element enthält.

    Dein bisheriger Ansatz ist auf jeden Fall nicht gut.

    Edit:
    Schau dir mal diesen Codeausschnitt an. Dort wird INotifyPropertyChanged erklärt. Der einzige Codeausschnitt, der für dich wirklich Relevanz haben dürfte, ist der der Klasse DemoCustomer.
    Sobald das Interface implementiert wird, hast du ein Ereignis mit dem Namen PropertyChanged. Das soll dann ausgelöst werden, wenn sich eine der Eigenschaften des Objekts ändert. Folglich implementierst du alle Eigenschaften so, dass sie bei einer Änderung ihres Wertes das Ereignis auslösen und dort ihren Namen nach außen weitergeben.
    Durch diese Vorgehensweise kann von außen her auf die Änderungen der Eigenschaften direkt reagiert werden (ansonsten müsste man einen Timer benutzen, der überprüft, ob sich Eigenschaften geändert haben, was äußerst ineffizient sein kann).

    Viele Grüße
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()