Unterfunktionen bei Controls

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

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Unterfunktionen bei Controls

    Hallo,
    ich bastle mir gerade ein Control, und bin dabei auf folgendes Problem gestoßen,
    nähmlich wie man Unterfunktionen des Controls erstellt, dabei aber auf einen Wert
    der übergeordneten Klasse zugreifen kann.

    Ich gebe mal ein Beispiel

    VB.NET-Quellcode

    1. public class Eins
    2. public einWert as string = "Hallo"
    3. public class zwei
    4. public shared function Test() as string
    5. return einWert
    6. end funtion
    7. end class
    8. end class
    9. 'Aufrufen in einer Form, will ich dass dann so:
    10. label1.text = Eins.Zwei.Test

    Jetzt kommt aber die Fehlermeldung:
    "Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis"

    Wenn ich nun einWert als Shared deklariere, ist dieser Wert bei allen Controls gleich,
    wenn man mehrere hinzufügt.

    Weiß jemand, wie ich dass Problem lösen kann?
    Danke im Vorraus für alle Antworten.


    EDIT: Bitte letzten Post lesen

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

    Kilian_98 schrieb:

    dabei aber auf einen Wert der übergeordneten Klasse zugreifen kann.
    Alles was das Control braucht, muss die übergeordnete Klasse dem Control zur Verfügung stellen.
    Dafür verwende entsprechende Properties.
    Die umgekehrte Logik, dass sich ein Control sich bei seinem Parent bedient, ist kein guter Programmierstil.
    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!

    Kilian_98 schrieb:

    Welche wären das?
    Die, die Du im Control brauchst und die vom Parent gefüttert werden müssen.
    Ich kenn doch Dein Control nicht. :/
    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!

    VB.NET-Quellcode

    1. Public Class ParentClass
    2. End Class
    3. Public Class ChildClass
    4. Private _parent As ParentClass
    5. Public Property Parent As ParentClass
    6. Get
    7. Return _parentClass
    8. End Get
    9. Private Set(value As ParentClass)
    10. _parent = value
    11. End Set
    12. End Property
    13. Public Sub New(parent As ParentClass)
    14. If parent Is Nothing Then Throw New ArgumentNullException("parent")
    15. Me.Parent = parent
    16. End Sub
    17. End Class

    Sowas. Beachte, dass du eigentlich nicht auf das Control verweisen solltest, außer es ist tatsächlich Teil der Oberflächendarstellung, zu der das Control selbst ebenfalls gehört, nicht bspw. der Daten. Ansonsten wäre auf die Daten zu verweisen, die benötigt werden oder diese im Konstruktor mitzuteilen.

    Gruß
    ~blaze~

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

    Auf jeden Fall danke schon mal für die Mühen.

    Mein Problem ist aber nocht nicht ganz gelöst, die Klasse Zwei soll sich ja
    IN der Klasse Eins befinden, sodass man
    Eins.Zwei.Test aufrufen kann.
    Wenn ich die Klassen also ineinander packe,
    muss ich die Function Test als Shared deklarieren,
    und wenn ich dass mache, funktioniert es auf einmal nicht mehr.

    Vielleicht brauche ich nur einen anderen Ansatz. Eigentl. will ich ja nur Unterfunktionen in das Control einbauen, wie zb

    VB.NET-Quellcode

    1. MessageBox.show(TestControl.Extras.MachWas)



    EDIT: OK, scheint als hätte ich sehr viele Sachen durcheinander gebracht.
    Hat jemand eine Lösung dafür, wie man einem UserControl 'Unterfunktionen' hinzuzufügen, auch wenn es mit dem oben
    geschriebenen nichts zu tun hat. Es geht ja eigentl. um die Unterfunkitionen

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

    Kilian_98 schrieb:

    Mein Problem ist aber nocht nicht ganz gelöst, die Klasse Zwei soll sich ja
    IN der Klasse Eins befinden, sodass man
    Eins.Zwei.Test aufrufen kann.
    Dein Problem ist, dass du Begriffe unscharf verwendest, und infolgedessen einen Datentyp nicht von einem Objekt unterscheidest.
    Eins.Zwei.Test wird man nie aufrufen können, denn Eins ist ein Datentyp (eine klasse), und kein Objekt.
    gugge VeryBasics

    Also wenn du die Klasse Eins so bautest, dass sie eine Property vom Typ Zwei enthielte, und wenn du dann vom Datentyp Eins ein Objekt erstellst, dann könntest du aufrufen:

    VB.NET-Quellcode

    1. Dim myEinsObjekt=new Eins
    2. Dim testValue = myEinsObjekt.Zwei.Test()

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Kilian_98 schrieb:

    Vielleicht brauche ich nur einen anderen Ansatz.
    Sieh Dir mal an, wie ein OpenFileDialog von der aufrufenden Klasse per Properties mit Informationen vollgepunpt wird:

    VB.NET-Quellcode

    1. Using dlg As New OpenFileDialog
    2. dlg.Filter = "Texte|*.txt|alle Dateien|*.*"
    3. dlg.FilterIndex = 1
    4. dlg.RestoreDirectory = True
    5. dlg.FileName = "c:\Temp\test.txt"
    6. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    7. Return
    8. End If
    9. End Using
    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!
    @Gonger96 Ich bräuchte so was wie ein Namespace innerhalb einer Klasse.

    @Rod So mache ich es aktuell, ich wollte das ganze nur übersichtlicher machen, die Funktionen
    quasi in Kategorien einteilen, aber ich denke ich mache es einfach normal.

    Auf jeden Fall Danke für alle Antworten

    Kilian_98 schrieb:

    Namespace innerhalb einer Klasse
    gibt es nicht.
    Aber Du kannst Quellcode gruppieren mit Regionen:

    VB.NET-Quellcode

    1. #Region "MeineRegion"
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. End Sub
    4. #End Region
    oder
    Du kannst Quellcode auf mehrere Dateien aufteilen mit Partial Class

    VB.NET-Quellcode

    1. Partial Public Class xxx
    2. End Class

    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!

    Visual Basic-Quellcode

    1. Public Class ClassA
    2. Public Property B As ClassB
    3. End Class
    4. Public Class ClassB
    5. Public Property C As Integer
    6. End Class

    Visual Basic-Quellcode

    1. Dim a As New ClassA
    2. a.B = New ClassB
    3. a.B.C = 4
    4. MessageBox.Show(a.B.C.ToString())
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Gonger96 schrieb:

    Wieso nicht nur ein Namespace?

    Das ganze soll ja im Endeffekt ein UserControl werden (vielleicht habe ich das nicht richtig rübergebracht, mit meinem ganzen Gelabere). ?(
    Mit einem Namespace könnte ich zwar dann

    MyNamespace.Control1

    aufrufen, aber ich möchte ja eher so was machen

    Control1.Extras.MachWas

    um die übersicht bei den Funktionen des Controls zu erhöhen.

    Das was RodFromGermany schreibt, geht in die richtige Richtung, aber leider kann ich auf die Funktion
    die innerhalb der Partial Public Class steht
    als Benutzer des Controls nicht zugreifen. Dann kommt wieder die Meldung:
    "Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis"

    Die Vorschläge von ThePlexian und Gonger96 sind auch nicht schlecht, aber für den Benutzer des Controls
    wäre das ja wieder ein zusätzlicher Aufwand, anstatt eine Erleichterung der Bedingung, es sei denn, man kann
    es schon in die Class einbauen. (Kann natürlich auch sein, dass ich zu blöd dazu bin, eure Vorschläge sinnvoll zu interpretieren :))

    Auf jeden Fall vielen Dank für eure Geduld mit mir. :thumbsup:

    EDIT: Ja, ich war einfach zu blöd das ganze richtig einzusetzen

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

    Kilian_98 schrieb:

    Dann kommt wieder die Meldung:
    die mit Partial Class absolut nix zu tun hat, sondern auf einen Verweis, der mit dem Klassennamen, nicht aber mit dem Instanznamen versehen ist.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim xx As New XYZ
    4. xx.bla = 5
    5. XYZ.bla = 7
    6. End Sub
    7. End Class
    8. Partial Class XYZ
    9. Public Property bla As Integer
    10. End Class
    Bilder
    • partial.png

      12,05 kB, 716×225, 193 mal angesehen
    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!