2fach verschachtelten Control Panel->GroupBox->Label Wert zuweisen

  • VB.NET

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

    2fach verschachtelten Control Panel->GroupBox->Label Wert zuweisen

    Guten Tag,
    habe folgendes Problem wo ich nicht mehr weiterkomm

    VB.NET-Quellcode

    1. DirectCast(Main_Form.Panel1.Controls(sLabelArray(iCount1)), Label).Text = sTmp ' Geht
    2. DirectCast(Main_Form.Controls(sDest).Controls(sLabelArray(iCount1)), Label).Text = sTmp 'Geht nicht


    Habe übrigens den sDest genau den Namen über die Eigenschaft zugewiesen, also es steht "Panel1" drinnen, trotzdem kommt Null Reference Exeption, warum?
    In welchem Kontext stehen Deine beiden Programmzeilen?
    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!
    Die beiden Zeilen gehören zu einer Funktion, die anhand der Parameter bestimmte Stellen in einer Textdabei ausliest und bestimmte Controls im Programm ändert

    Aufruf der Funktion sieht dann so aus

    VB.NET-Quellcode

    1. iPos = 0
    2. ReDim aSLabels(1)
    3. aSLabels(0) = "Label27"
    4. aSLabels(1) = "Label28"
    5. iPos = ConfigHandling.MultiDestinationHandling(sSektor, Main.PanelWerkzeug.Name, aSLabels, iAtPos:=iPos)
    6. ReDim aSLabels(2)
    7. aSLabels(0) = "Label4"
    8. aSLabels(1) = "Label14"
    9. aSLabels(2) = "Label21"
    10. iPos = ConfigHandling.MultiDestinationHandling(sSektor, Main.GroupBoxUrsprung.Name, aSLabels, iAtPos:=iPos)


    Die Funktion selber

    VB.NET-Quellcode

    1. Public Shared Function MultiDestinationHandling(ByVal sSektor As String, ByVal sDest As String, ByVal sLabelArray() As String, _
    2. ByVal iAtPos As Integer) As Integer
    3. Dim iPos, iCount1, iCount2 As Integer
    4. Dim sTmp As String
    5. If iAtPos = 0 Then
    6. iPos = GetSektor(sSektor)
    7. Else : iPos = iAtPos
    8. End If
    9. iCount1 = 0
    10. If iPos <> 0 Then
    11. Do While iCount1 <= sLabelArray.Length - 1
    12. iCount2 = InStr(iPos, Main.simport, ";", CompareMethod.Text) + 1
    13. sTmp = Mid(Main.simport, iPos, iCount2 - iPos - 1)
    14. If sDest = iBlade.PanelWerkzeug.Name Then
    15. DirectCast(Main.PanelWerkzeug.Controls(sLabelArray(iCount1)), Label).Text = sTmp
    16. ElseIf sDest = Main.GroupBoxUrsprung.Name Then
    17. DirectCast(Main.GroupBoxUrsprung.Controls(sLabelArray(iCount1)), Label).Text = sTmp
    18. ElseIf sDest = Main.GroupBox1.Name Then
    19. DirectCast(Main.GroupBox1.Controls(sLabelArray(iCount1)), Label).Text = sTmp
    20. End If
    21. iPos = iCount2
    22. iCount1 = iCount1 + 1
    23. Loop
    24. Return iPos
    25. End If
    26. Return 0
    27. End Function
    Die Shared-Prozedur sollte wegen ihrer Nicht-Instanz-Zugehörigkeit auf Main.PanelWerkzeug.Controls gar keinen Zugriff haben.
    Wenn das der VB-Compiler zulässt, X( .
    Ändere ggf. Deine Philosophie.
    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!
    Gewiße Labels sind Public Shared, darum hab ich auch von meinen neuen HandlingsObjekt darauf Zugriff, nun bleibt die Frage offen warum ich trotz des korrekt benannten Panels bzw. GroupBox (Bsp. Main.PanelWerkzeug.Name) dieser Fehler kommt?
    Muß ich da noch irgendwie angeben, das sDest ein Panel ist oder GroupBox bevor ich über sLabelArray(iCount1) den dortigen Label einen neuen Text gebe?

    [vb]
    DirectCast(Main_Form.Panel1.Controls(sLabelArray(iCount1)), Label).Text = sTmp ' Geht
    DirectCast(Main_Form.Controls(sDest).Controls(sLabelArray(iCount1)), Label).Text = sTmp 'Geht nicht
    /vb]
    Mir scheint, du wuselst hier Daten und Gui durcheinander. Kann es sein, das du versuchst von einer separaten Klasse, die die Berechnungen durchführt, auf deine Steuerelemente der Form zuzugreifen? Ich vermute weiterhin, dass Main und Main_Form die Namen der Klassen und nicht die Instanzen der Form sind?

    Schöner ist eine Klasse mit den Berechnungen und Properties der darzustellenden Variablen.
    Von deiner Form aus startest du deine Berechnung und holst dir anschließend die Werte der Variablen aus der Klasse in die Controls.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hallo,
    Main und Main_Form sind 2 Varianten des Programms, weil ich verschiedene Lösungswege ausprobiere. Hier mit der Funktion habe ich mich entschieden, mittels einer Methode die Daten des Forms zu ändern. Klar dies geschieht momentan unsaubererweise über ein anderes Objekt, nur muß ich irgendwo ja die .Text Properties ändern und will das Main - Objekt nicht zu sehr aufblähen mit Code, Die neue Klasse ist eher als SubObjekt von Main zu betrachten, welches in eine neue Datei ausgelagert ist.
    Nun bleibt immernoch die Frage offen, wie ich den Referenz 0 Fehler wegbekomme bei

    VB.NET-Quellcode

    1. DirectCast(Main_Form.Panel1.Controls(sLabelArray(iCount1)), Label).Text = sTmp ' Geht
    2. DirectCast(Main_Form.Controls(sDest).Controls(sLabelArray(iCount1)), Label).Text = sTmp 'Geht nicht


    Übergangsweise hab ich es ja mit den else if -> Direktnamen gelöst, was halt momentan leider paar Zeilen mehr bedeutet (Will das Programm ja kurz aber kompakt halten, wegen der Übersichtlichkeit)

    Cyberdine schrieb:

    VB.NET-Quellcode

    1. DirectCast(Main_Form.Panel1.Controls(sLabelArray(iCount1)), Label).Text = sTmp ' Geht
    2. DirectCast(Main_Form.Controls(sDest).Controls(sLabelArray(iCount1)), Label).Text = sTmp 'Geht nicht
    Habe übrigens den sDest genau den Namen über die Eigenschaft zugewiesen, also es steht "Panel1" drinnen, trotzdem kommt Null Reference Exeption, warum?
    sehr einfach: in Main_Form.Controls findet er kein Control mit .Name-Property "Panel1".

    Kannst dir spaßeshalber mal alle .Name-Properties der Controls von Main_Form ausgeben lassen.

    Cyberdine schrieb:

    Main und Main_Form sind 2 Varianten des Programms, weil ich verschiedene Lösungswege ausprobiere.
    Dann sollten gewisse Klassen daraus gemeinsame Basisklassen haben.
    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!
    Ja werde ich mal ausprobieren.
    Wegen vorhin muß ich noch dazu erwähnen, aber bitte nicht erschrecken, daß das Main-Objekt vollgestopft ist mit Modulen, darum ist das auch so aufgebläht. Warum mein Vorgänger das nicht konsequent objektorientiert programmiert hat, ist mir ein Rätsel. Werde das aber Stück für Stück sauber umschreiben, momentan ist halt erstmal wichtig das es funktioniert, wenn die Demo-Version davon raus ist, kann ich mir mehr Zeit dafür nehmen.
    Was ich auch noch dazu erwähnen will, ist das das Objekt hier auf "alle" Forms zugreifen soll/muß, da es sich um Sprachstrings handelt und dann alle Labels etc. geändert werden müßen.
    Alle Forms stimmt aber auch "noch" nicht, da das ganze Main ein Form ist und die SubForms lediglich Panels sind, die einfach übereinander gelegt sind "was im Designer ziemlich nervig ist, mit den durchblättern". Modular in einen Objekt programmieren ist halt noch der andere Störfaktor.

    Cyberdine schrieb:

    das das Objekt hier auf "alle" Forms zugreifen soll/muß, da es sich um Sprachstrings handelt
    Das ist der absolute Holzweg.
    Trenne GUI und Daten. Wenn Du Deine Programme mehrsprachig machen willst, sieh Dir mal dieses Tut an.
    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!
    Habe mal bei einen kleinen Form was ich gefunden habe, deinen Lösungsansatz probiert. Ist viel sauberer so, werde das in Zukunft so beibehalten. Eigentlich hätte ich das ganze Programm bis auf den Kern so neu schreiben sollen von Anfang an, daß hätte viel Zeit gespart als an den bestehenden Programm rumzudoktern. Zumal ja schon wöchentlich neue Felder und Funktionen dazu kommen ( Als Freiberufler hätte ich da eh schon längst ein Pflichtenheft verlangt....) Dein Tutorial ist auch recht Interessant, werde mich da auch mal weiter reinlesen demnächst.

    Vielen Dank für die Infos.

    Cyberdine schrieb:

    Als Freiberufler hätte ich da eh schon längst ein Pflichtenheft verlangt....
    Als Freiberufler darfst Du nur schriftlich fixierte Sachen machen, sonst sind die anderen niemals mit der "Lieferung" einverstanden. Du musst ganz klar Leistung und Termin spezifizieren.
    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!