Prüfen ob Variable in Klasse ?

  • VB.NET

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

    Prüfen ob Variable in Klasse ?

    Ich weiß nicht wie ich die Frage genau stellen soll. Ich habe folgendes Problem.

    VB.NET-Quellcode

    1. For Each f As Form In System.Windows.Forms.Application.OpenForms
    2. If f.Name = "status" And f.artikel = CInt(dt(e.RowIndex)(1)) Then
    3. f.Close()
    4. Exit For
    5. End If
    6. Next


    Er sagt mir das f.artikel kein Member von form sei. Logisch aber wie stell ich die Frage wenn ich eben alle offenen Fenster durchsuche wo eben doch eine Form bei ist die eine Artikel Variable besitzt ?
    In Arbeit...
    Hallo @vico255

    Hier bieten sich Interfaces an.

    Erstelle ein Interface mit deiner "Variable" als Property.

    VB.NET-Quellcode

    1. Public Interface IStatusForm
    2. Property Status as String
    3. End Interface


    Soll eine Form dieses Property besitzen dann implementierst du es:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Implements IStatusForm
    3. Public Property Status as String Implements IStatusForm.Status
    4. End Class


    Wenn du dann ein Form benötigst welches dieses Interface implementiert dann kannst du das nun abfragen:

    VB.NET-Quellcode

    1. If f.GetType Is IStatusForm Then
    2. Debug.WriteLine(DirectCast(f,IStatusForm).Status)
    3. End If



    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ok, da haben wir mehrere Punkte, die wir abarbeiten müssen.

    1. Ja, das geht. Nämlich mit Reflection. Du kannst dir von jedem Objekt den Typ holen, dann abfragen, ob der Typ ein Feld bzw. eine Property mit dem Namen hat und dann den Wert des Feldes bzw. der Property herausholen.
    Ist aber total übertrieben und lässt sich besser lösen. Man arbeitet hier nämlich "hinterrücks" am Compiler vorbei.

    2. Hast du überhaupt mehrere Form-Typen, die so ein Artikel-Feld oder -Property haben? Erscheint mir architektonisch komisch. Wenn du nur einen Typ hast, davon aber mehrere Instanzen, dann kannst du einfach sowas machen:

    VB.NET-Quellcode

    1. For Each i In Application.OpenForms
    2. If TypeOf i Is DeineForm
    3. Dim f = DirectCast(i, DeineForm)
    4. If f.Name ... AndAlso f.Article ... Then
    5. f.Close()
    6. Exit For
    7. End If
    8. End If
    9. Next


    3. Wenn du tatsächlich mehrere Form-Typen hast, dann kannst du sowas machen:

    VB.NET-Quellcode

    1. Public Interface IArticleForm
    2. Property Article As Foo
    3. End Interface

    Und dann jede Form, beid der du das brauchst, dieses Interface implementieren lassen:

    VB.NET-Quellcode

    1. Public Class DeineForm
    2. Implements IArticleForm
    3. Public Property Article As Foo Implements IArticleForm.Article
    4. '...
    5. End Class

    Dann kannst du darauf abfragen:

    VB.NET-Quellcode

    1. For Each i In Application.OpenForms
    2. If TypeOf i Is IArticleForm
    3. Dim f = DirectCast(i, IArticleForm)
    4. If i.Name ... AndAlso f.Article ... Then 'Bechate den Unterschied zu Punkt 2 hier: i statt f, weil IArticleForm natürlich kein Name und Close deklariert.
    5. i.Close()
    6. Exit For
    7. End If
    8. End If
    9. Next


    4. Was anderes?
    Du hast im Startpost nicht allzuviel Kontext gegeben. Wenn du uns erklärst, was du eigentlich vor hast, dann kann man velleicht eine bessere Lösung finden.
    Klassisches Beispiel: "Wie kann ich einen Code alle Sekunden wiederholen?"
    "Dafür verwendet man einen Timer, aber was hast du eigentlich vor?"
    "Ich will abfragen, wann der WebBrowser die Seite geladen hat und dann was machen."
    "Aha! Dafür kann man direkt das DocumentCompleted-Event verwenden."


    PS: Es gibt da noch ein paar Schönheitsfehler bei dir im Code.

    Deutsche Bezeichner sind eigentilch ein No-Go. Bei domänenspezifischem Jargon kann man eine Ausnahme machen, aber das ist bei "Artikel" nicht der fall -> "Article". (Öffentliche Bezeichner werden in .NET übrigens immer mit PascalCase geschrieben, nicht mit camelCase.)

    Wenn du mehrere Bedingungen in einer If-Abfrage kombinierst, dann solltest du nicht And und Or verwenden, sondern AndAlso und OrElse. Beispiel: Bei If x IsNot Nothing And x.IsFoo Then prüft man zuerst, ob das Objekt nicht null ("Nothing" in VB) ist und erst dann ruft man davon IsFoo ab. Wenn x aber null ist, fliegt trotzdem eine NullReferenceException. Bei And werden immer beide Seiten ausgewertet. AndAlso wertet die rechte Seite nicht aus, wenn die linke schon False ist, weil schon klar ist, dass das Ergebnis von False AndAlso X niemals True sein kann. And und Or sind eigentlich für bitweise Operationen an Ganzzahltypen gedacht.

    dt scheint eine DataTable zu sein. Auffällig ist, dass du manuell irgendwelche Spalten anhand ihres Index raussuchst und das Ergebnis auch erst casten musst. @ErfinderDesRades kann dir mehr dazu sagen, der kennt sich damit aus. Da gibt's nämlich ein typisiertes DataSet.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

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

    Erstmal Danke für eure Antworten.

    Ich habe einige Aufträge in einer DGV. Wenn ich nun weitere Infos zu den Aufträgen habe möchte öffne ich eine neue Form ( Status ). Ein Fenster wo übersichtlich alles zum Auftrag steht.

    Wenn

    Quellcode

    1. f.artikel <> CInt(dt(e.RowIndex)(1))

    = Wenn die Variable (artikelNr int) es Fensters ungleich DatatableZelle, dann soll er das Fenster Schließen. Damit ich ein neues Aufrufen kann mir den aktuellen Daten zum Auftrag.

    Ich hoffe man versteht es einigermaßen. Ich habe mehrer Fenster in meiner Form offen, deshalb

    Quellcode

    1. For Each i In Application.OpenForms
    .
    In Arbeit...

    vico255 schrieb:

    Ich hoffe man versteht es einigermaßen
    Nicht ganz.
    Führe doch alles auf eine gemeinsame DataTable zurück, die weiß dann, was für Spalten erwartet werden, und den Namen kannst Du von der Tabelle per Index abfragen, da brauchst Du keine Variable für.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!