Controls während der Laufzeit Ändern, Text Aktualisiert nicht..

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

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von seby1302.

    Controls während der Laufzeit Ändern, Text Aktualisiert nicht..

    Hallo ich erstelle während der Laufzeit Ein Label und lade ein Wert hinein, soweit klappt es auch.

    Mein Problem ist, das dieser Zwar Neugeladen wird wenn es sich Ändert.
    Jedoch Aktualisiert Sich Nicht im Label Text?

    Was mache ich da falsch ?(


    VB.NET-Quellcode

    1. Dim sqlQuery As String = "SELECT Guthaben FROM User"
    2. Using sqlConn As New MySqlConnection(connString)
    3. Using sqlComm As New MySqlCommand()
    4. With sqlComm
    5. .Connection = sqlConn
    6. .CommandText = sqlQuery
    7. .CommandType = CommandType.Text
    8. End With
    9. Try
    10. sqlConn.Open()
    11. Dim sqlReader As MySqlDataReader = sqlComm.ExecuteReader()
    12. While sqlReader.Read()
    13. Guthaben = sqlReader(2)
    14. Dim Label1 As Label = New Label
    15. Label1.Name = "Label1"
    16. Label1.Left = 10 + 1 * 2
    17. Label1.Top = 45 + 1 * 2
    18. Label1.Size = New Size(310, 20)
    19. Label1.Text = "Guthaben: " & Guthaben
    20. Form1.TabPage1.Controls.Add(Label1)
    21. End While
    22. Catch ex As MySqlException
    23. conn.Close()
    24. MsgBox(ex.Message)
    25. End Try
    26. End Using
    27. End Using
    28. End Sub


    *Topic verschoben*

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

    seby1302 schrieb:

    VB.NET-Quellcode

    1. Form1.TabPage1.Controls.Add(Label1)
    Du arbeitest wohl auf der falschen Form1-Instanz.
    Studiere und verstehe diesen Thread:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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!
    Ich hab Jetzt Alles Im Form1 Verschoben, und ist genau das selbe..

    Folgendes...
    wenn ich nur Label1 mache und

    VB.NET-Quellcode

    1. ​Dim Label1 As Label = New Label
    Außerhalb des Sub dann aktualisiert er es.

    Lade ich aber Label1 Im Groupbox geht's nicht mehr.

    VB.NET-Quellcode

    1. ​GroupBoxes.Controls.Add(Label1)


    Hab auch ein Panel Probiert, selbes Problem. ?(

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

    RodFromGermany schrieb:

    Studiere und verstehe diesen Thread:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Bester Rat den man dir an dieser Stelle geben kann.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Nur mal, um alle Spekulatiuskrümel hier wegzukehren: In welchem Form findet dieser DB-und-Labelerstell-Code statt? Form1 oder woanders?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hat sich Erledigt war schon alles richtig, nur er hat es nicht neu geladen, ich hatte mit Dispose Probiert was ja nicht gehen könnte.
    Nun kam ich auf die Idee Stattdessen das so zu machen....

    VB.NET-Quellcode

    1. Dim Label1 As Label = New Label Dim Username as String Private Sub *****
    2. 'Datenbank Laden wie Oben
    3. Label1.Invalidate() ' Und Tataaaaaa!
    4. Label1.Name = "Label1"
    5. Label1.Left = 10 + 1 * 2
    6. Label1.Top = 45 + 1 * 2
    7. Label1.Size = New Size(310, 20)
    8. Label1.Text = "Guthaben: " & Guthaben
    9. Form1.TabPage1.Controls.Add(Label1)
    @seby1302 Verstehe das, was in diesem Thread diskutiert wird,
    Du arbeitest in mehreren Instanzen von Form1, eine davon ist dioe sch... mist ranz uralte VB6-Kompatibilitätsinstanz:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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!
    Folgendes geht an @seby1302 und @RodFromGermany: :huh:
    Denn: Es wurde immer noch nicht geklärt, ob wir im selben Form unterwegs sind oder mit nicht oder was genau Form1 ist. Zum anderen ergibt die vermeintliche "Lösung" keinen Sinn. Ok, wenn es klappt, ist es müßig darüber zu diskutieren, aber damit würde es nur ein einziges Label geben. Und der Post#1-Code ließ vermuten, das ggf. mehrere erzeugt werden (sollen). Aber ein neues Label, unverwendetes zu invalidieren, ist nicht der Weg, den man einschlagen sollte.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Korrekt.
    @seby1302 Sende aus dieser Klasse ein Event an die Deine Klasse aufrufende Form, in dessen Argument Du das erzeugte Label übergibst oder du überträgst die Information und lässt die Form das Label selber anlegen, was ich für die bessere Lösung halte.
    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!
    Problem ist die Fortschleife gewesen, die Brauche ich aber um dem Nexte Box daneben zu stellen Dynamisch. x,y
    Jedenfalls habe ich eine Messagebox rein Gepackt und gesehen, das er 15 Stk Label1 Überlappt erzeugt hatte.
    Der Erste Wurde dann Natürlich Aktualisiert, ich konnte aber nix sehen da 14 Weitere Oben Drauf waren
    Die Meldung sagte aber eindeutig, beim Ersten mal.
    15x Label1.Text = "Alter Text"
    Beim Aktualisieren dann...
    1x Label1.Text = "Neuer Text" danach 14x Label1.Text = "Alter Text"
    Nun habe ich mir Noch ein Counter gebaut der zählt die Stepps, und wenn diese = ID ist, Aus Datenbank dann wird die Schleife Beendet.
    Außerdem Hatte ich das Problem, das bei Erneut Aktualisieren er mir wieder Neue Erzeugt hat. Das Konnte ich aber lösen indem ich Die Vorhandene (Falls Vorhanden) Als ungültig Erkläre und Dispose.

    Nein Nicht im Selben Form.
    Form1 Ist das Haupt Form.
    Dort liegt meine TabPage drauf.
    Der Code ist in einem Modul mit dem dazu gehörigen Funktionen etc..
    Die Labels etc sollen aber auf der TabPage erzeugt werden, die auf Form 1 Liegt.

    Inzwischen wurde das ganze auch angepasst, das war nur ein schneller test..

    VB.NET-Quellcode

    1. Label1 = New Label1 With {
    2. .Name = "Label1" & IdFrDb - 1,
    3. .Left = 10 + x * 360,
    4. .Top = 10 + y * 0,
    5. .Size = New Size(350, 200),
    6. .Text = "Guthaben" & Guthaben
    7. }
    8. Form1.TabPage1.Controls.Add(Label1)

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

    Dann ne kurze Frage zum Abschluss: Woher kennt das SubForm, in dem die Labels erstellt werden, das MainForm? Gibst Du das dem SubForm über einen Parameter mit oder wie ist Form1 innerhalb des SubForms definiert?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ist ja kein Subform Es ist ein Modul
    Und Über Form1.TabPage1.Controls.Add(Label1) Sage ich Erstelle sie Dorthin auf Hauptform eben.

    Mein einziges Problem ist nun, das beim starten der Applikationen diese erstellt werden.
    Soweit so gut....

    Möchte ich aber nun, Aktualisieren.
    Seis das nur die werte in den Labels sich ändern sollen.
    Muss ich erstmal checken ob welchen vorhanden sind.
    Wenn vorhanden Text Editieren wenn nein Herstellen.

    Dann sagt er mir, wurde nicht auf Instanz Festgelegt, weil der label erst weiter unten im code ist....
    Wenn ich also nicht Dispose, Herstellt er mir neue Aber Nach der Position aus den alten(Die alten Bleiben Vorhanden).
    Wenn ich Dispose joa dann eben nicht auf instanz festgelegt.
    Wie stelle ich das nun an..



    VB.NET-Quellcode

    1. Dim GroupBoxes As GroupBox
    2. Private Sub ControlsHerstellen()
    3. 'Mysql Blablabla....
    4. While sqlReader.Read()
    5. IdCount = sqlReader(0)
    6. Username = sqlReader(1)
    7. PositionXGroupbox = PositionXGroupbox + IdCount - 1
    8. PositionYGroupbox = PositionYGroupbox + IdCount - 1
    9. GroupBoxes = New GroupBox
    10. If "GroupBox" & IdCount = GroupBoxes.Name Then ' Das Hier Erkennt er nie......
    11. GroupBoxes.Text = Username
    12. MessageBox.Show("Edit")
    13. Else
    14. GroupBoxes.Name = "GroupBox" & IdCount
    15. GroupBoxes.Left = 10 + PositionXGroupbox * 360
    16. GroupBoxes.Top = 10 + PositionYGroupbox * 0
    17. GroupBoxes.Size = New Size(350, 200)
    18. GroupBoxes.Text = Username
    19. Form1.TabPage1.Controls.Add(GroupBoxes)
    20. MessageBox.Show("Neu")
    21. End If
    22. End While
    23. End sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „seby1302“ ()

    Da würd ich sagen: Fehlkonstruktion. Warum muss das ein Modul können, wenn sich das MainForm selber drum kümmern kann? Ist ja nix dagegen einzuwenden, dass im Modul die Daten aus der DB geholt werden, damit alle Forms darauf Zugriff haben (obwohl das auch schon komisch ist), aber die MainForm-Änderung sollte das MainForm selber machen. Oder jemanden dafür beauftragen. Aber ein Modul, welches das ohne "Erlaubnis" des MainForms macht, ist … naja, eine funktionierende, aber dennoch fragliche Fehlkonstruktion.
    Grundsätzlich sollte die aufrufende Funktion (wo immer sie auch am Ende ist) prüfen, ob das ZielContainerControl schon Labels oder GroupBoxes oder wasauchimmer enthält. Und dann entsprechend reagieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja Stimmt schon, Habe es auch Im Form Verschoben, allerdings Immer Selbe Ergebnis.
    HABS endlich :whistling:
    Ich trottelt, eigentlich total Easy...

    Problem ist eben der Label/Box Bekommt sein Name Später wie die IF anfrage eigentlich entsteht....
    Auch Wen Der Box Im Laufzeit Erzeugt wurde, im Code Steht er aber erst Nach Der If anfrage, und somit reagiert er nicht...
    LÖSUNG:

    VB.NET-Quellcode

    1. If GroupBoxes(IdCount - 1) Is Nothing Then ' So wird es erkannt Ob Vorhanden oder nicht. Wenn nicht Vorhanden Erzeugt er es, wenn doch dann Else. Sollte eine neue Tabelle Erzeugt worden Sein, Wird ein neus Box Erzeugt und alles Aktualisiert.
    2. GroupBoxes(IdCount - 1).Name = "GroupBox" & IdCount - 1
    3. GroupBoxes(IdCount - 1).Left = 10 + PositionXGroupbox * 360
    4. GroupBoxes(IdCount - 1).Top = 10 + PositionYGroupbox * 0
    5. GroupBoxes(IdCount - 1).Size = New Size(350, 200)
    6. GroupBoxes(IdCount - 1).Text = Username
    7. TabPage1.Controls.Add(GroupBoxes(IdCount - 1))
    8. elseIf GroupBoxes(IdCount - 1).Name = "GroupBox" & IdCount - 1 Then
    9. MessageBox.Show("Edit")
    10. GroupBoxes(IdCount - 1).Text = Username
    11. End If


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „seby1302“ ()

    seby1302 schrieb:

    Es ist ein Modul
    Das sind Informationen, die in den Eröffnungspost gehören.
    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!
    Im Sorry, werde ich nexte mal erwähnen :)

    Ich hätte noch eine Frage..

    Es werden Später unendlich viele Combobox Hergestellt 1 Pro User.
    Da ich Gerne 5 In Reihe hätte und ab Nr 6 Eine neue Reihe weiter unten.
    Beispiel:
    12345
    678910

    Würde ich Mein GroupBoxes(IdCount).Top = 190 + 7 * 2 Dynamisch Gestalten.
    Dachte eventuell, die Id was mit 1 anfängt aus IdCount.
    Im Array zu packen und von dort aus Checken ob Alle 5,10,15,20 etc Durchlaufen sind.

    Nur wie Genau, oder habt ihr ein andres Vorschlag.?

    Lg
    @seby1302 Sieh Dir mal das FlowLayoutPanel an.
    Das ordnet die Childs nach vorgegebenem Muster ordentlich 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!