Dynamische Controls verschwinden

  • VB.NET

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

    Dynamische Controls verschwinden

    Hallo,

    ich bin ganz frisch hier im Forum und hoffe, einer (oder mehrere) von euch können mir bei meinem Problem helfen.

    Ich programmiere mit Visual Studio 2010 gerade eine Art Haushaltsbuch (kein Mdi), bei dem verschiedene by CouponDropDown">Profile angelegt werden können usw.

    Jetzt ist es so, dass ich im Formular "Neues Profil anlegen" ein
    TabControl mit 3 TabPages habe. In zweien von denen sind bereits
    Steuerelemente (Textboxen, NumericUpDown, DropDownList, Checkbox etc.)
    angelegt. Bei Klick auf den Button "Neue Ausgabe hinzufügen" sollen
    diese Controls dynamisch sozusagen dupliziert werden, einfach
    ausgedrückt soll eine neue Zeile (bestehend aus diesen Controls)
    erstellt werden. An sich klappt das auch, mein Problem ist allerdings,
    dass die bisher erstellten (dynamischen) Zeilen bei wiederholtem Klick
    auf den Button verschwinden und lediglich die ursprünglich eingerichtete
    Zeile und die soeben erstellte Zeile im Tab sichtbar sind (wobei die
    dynamisch erstellte Zeile auch wie gewünscht nach unten wandert). Wie
    kann ich dafür sorgen, dass die bereits erstellten Zeilen sowohl
    sichtbar als auch zugreifbar sind? Hab bereits intensiv gegoogelt aber
    bin nicht wirklich schlauer geworden


    So erstelle ich die Controls:

    VB.NET-Quellcode

    1. Private Sub btnAusgabeDazu_Click(sender As System.Object, e As System.EventArgs) Handles btnAusgabeDazu.Click
    2. Dim BezeichnungA As New TextBox
    3. Dim AbbuchungA As New NumericUpDown
    4. Dim GutschriftA As New NumericUpDown
    5. Dim BetragA As New TextBox
    6. Dim IntervallA As New ComboBox
    7. Dim AuswahlA As New CheckBox
    8. Dim LabelA As New Label
    9. Dim ZählerNameA As Byte = 0
    10. Dim AbstandNeuA As Integer = 0
    11. Dim y = 28
    12. ZählerNameA += 1
    13. AbstandNeuA += 25
    14. With BezeichnungA
    15. .Name = "txtBezeichnungA" & ZählerNameA.ToString
    16. .Text = .Name
    17. .Height = 20
    18. .Width = 417
    19. .Top = y + AbstandNeuA
    20. .Left = 9
    21. End With
    22. With AbbuchungA
    23. .Text = .Value
    24. .Name = "nudAbbuchung" & ZählerNameA.ToString
    25. .Height = 20
    26. .Width = 120
    27. .Top = y + AbstandNeuA
    28. .Left = 432
    29. .Minimum = 1
    30. .Maximum = 31
    31. .Increment = 1
    32. .Value = 1
    33. .TextAlign = HorizontalAlignment.Right
    34. End With
    35. With BetragA
    36. .Text = "0,00"
    37. .Name = "txtBetragA" & ZählerNameA.ToString
    38. .Height = 20
    39. .Width = 100
    40. .Top = y + AbstandNeuA
    41. .Left = 564
    42. .TextAlign = HorizontalAlignment.Right
    43. End With
    44. With IntervallA
    45. .Text = ""
    46. .Name = "cboIntervallA" & ZählerNameA.ToString
    47. .Height = 20
    48. .Width = 145
    49. .Top = y + AbstandNeuA
    50. .Left = 710
    51. .Items.Add(Me.cboIntervallA.Items)
    52. End With
    53. With AuswahlA
    54. .Name = "ckbAuswahlA" & ZählerNameA.ToString
    55. .Height = 14
    56. .Width = 15
    57. .Top = IntervallA.Top + 3
    58. .Left = 858
    59. End With
    60. With LabelA
    61. .Text = "€"
    62. .Name = "LabelA" & ZählerNameA.ToString
    63. .Height = 13
    64. .Width = 14
    65. .Top = AuswahlA.Top
    66. .Left = 673
    67. .BackColor = Color.Transparent
    68. End With
    69. tabDaten.TabPages("tabAusgaben").Controls.Add(BezeichnungA)
    70. tabDaten.TabPages("tabAusgaben").Controls.Add(AbbuchungA)
    71. tabDaten.TabPages("tabAusgaben").Controls.Add(BetragA)
    72. tabDaten.TabPages("tabAusgaben").Controls.Add(LabelA)
    73. tabDaten.TabPages("tabAusgaben").Controls.Add(IntervallA)
    74. tabDaten.TabPages("tabAusgaben").Controls.Add(AuswahlA)
    75. End Sub



    Vielen Dank schonmal für hoffentlich hilfreiche Antworten und / oder Anregungen!!
    Willkommen im Forum. :thumbup:
    Probier mal dies:

    VB.NET-Quellcode

    1. Private y As Integer = 28
    2. Private Sub btnAusgabeDazu_Click(sender As System.Object, e As System.EventArgs) Handles btnAusgabeDazu.Click
    3. y += 28
    4. ' ...
    Natürlich mit Deinen Werten.
    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!
    Danke für die schnelle Antwort, Rod :)

    Das Problem besteht leider immer noch.

    Ich habe
    .Top = y + AbstandNeuA
    durch
    .Top = y
    ersetzt, da sonst jedesmal eine Zeile optisch übersprungen wird.

    Leider werden die zuvor hinzugefügten Zeilen noch immer ausgeblendet :(

    Könnte das Ganze vielleicht ein Anzeigeproblem sein? (find ich allerdings eher unwahrscheinlich)
    Hey,

    das klingt schwer nach einem Designfehler. Für ein Haushaltsbuch eignet sich ein typ. DataSet in Verbindung mit einem DataGridView am Besten.

    Zu Deinem Problem. Versuch mal, Deine neu erstellen Controls in ein FlowLayOutPanel zu packen. Das kümmerst sich selbstständig um die Ausrichtung. Achte hierbei auf die FlowDirection-Property des FlowLayOutPanels.

    Aber wie gesagt, je mehr Datensätze Du haben wirst, desto mehr wird Dir die Unzulänglichkeit dieser Vorgehensweise bewusst. Es führt kein weg an DataSet und DataGridView vorbei.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hallo SpaceyX,

    das DataGridView befindet sich auf dem Hauptformular und ist auch bereits mit nem DataSet gekoppelt, eine Datenbank (SQL Compact) existiert auch schon. Im angesprochenen Formular wird nur das Profil angelegt und auf der TabPage im Beispiel können monatliche Fixkosten angelegt werden, die jeden Monat automatisch sozusagen gebucht werden. Das werden also erfahrungsgemäß nicht allzu viele sein (vielleicht 10-15). Es gibt auch noch eine TabPage "Einnahmen" (entsprechend für die fixen monatlichen Einnahmen) - ist exakt genauso aufgebaut wie TabPage "Ausgaben" - und "Konto" (für den Ausgangskontostand und den Disporahmen).

    Das mit dem FlowLayoutPanel werd ich mal ausprobieren, hab damit noch nicht gearbeitet. :)

    Gwenny schrieb:

    Leider werden die zuvor hinzugefügten Zeilen noch immer ausgeblendet
    Wie sieht es bei Dir aus?
    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!
    Hallo, sorry, konnte ne Weile nicht am Programm arbeiten, geht jetzt aber weiter.

    Ohne FlowLayoutPanel sieht das Ganze bei mir wie im Anhang aus (hab das hier mit Bildern noch nicht so ganz raus :wacko: ). Mit FlowLayoutPanel hab ichs noch nicht wirklich gebacken bekommen, aber da gehört denk ich ein bisschen Gefummele dazu.

    LG Gwenny
    Dateien
    • Screenshot.doc

      (62,98 kB, 137 mal heruntergeladen, zuletzt: )
    Pack

    VB.NET-Quellcode

    1. Dim y As Integer = 28

    unterhalb des Klassennamens und füge am Ende der

    VB.NET-Quellcode

    1. Private Sub btnAusgabe....
    vor

    VB.NET-Quellcode

    1. End Sub
    folgendes hinzu:

    VB.NET-Quellcode

    1. y = y + AbstandNeuA


    Mit diesen Änderungen und Deinem Code (1:1) siehts bei mir schon besser aus :)
    So langsam glaub ich, dass es ein Darstellungsproblem ist. Die Controls werden nämlich immer noch nicht angezeigt :(

    EDIT: Mit dem Code oben hatte es ganz am Anfang ja auch schon supi geklappt (es wurden alle dynamischen Controls korrekt angezeigt) ... dann habe ich den Code entsprechend auf den Tab Einnahmen kopiert und angepasst und seitdem werden die Controls nicht mehr richtig angezeigt. Könnte dort das Problem liegen?
    Ähm, was genau meinst Du mit kopiert und angepasst?
    Du hast dann im Tab Einnahmen auch einen Button der 'ne Zeile einfügt, oder machst Du es mit dem ursprünglichen Button?
    Sagst Du dann der Sub auch sie soll die Controls in tabDaten.TabPages("tabEinnahmen")...... adden?

    Wie gesagt, bei mir funktioniert Dein Code aus Post #1 (mit der Änderung von vorhin) einwandfrei

    Gwenny schrieb:

    So langsam glaub ich, dass es ein Darstellungsproblem ist. Die Controls werden nämlich immer noch nicht angezeigt
    Nach dem Durchlesen Deines (ursprünglichen) Codes glaube ich eher an einen Programmierfehler:

    VB.NET-Quellcode

    1. Dim ZählerNameA As Byte = 0 ' <-- muss ausserhalb der Function im Klassenkopf definiert werden
    2. Dim AbstandNeuA As Integer = 0 ' <-- muss ausserhalb der Function im Klassenkopf definiert werden
    3. ....
    4. ZählerNameA += 1
    5. AbstandNeuA += 25

    Ausserdem kann man auf Byte nicht addieren, das wird intern hin- und her konvertiert: nimm hier Integer. Option Strict ON würde Dich bestimmt darauf hinweisen.

    Wenn die Controls auch benutzt werden sollen, so wirst Du denen auch noch jeweils einen EventHandler per AddHandler Statement hinzufügen müssen.

    GGf. wirst Du Dich mit einem TableLayoutPanel (nicht FlowLqayoutPanel) oder einem Usercontrol einfacher tun.
    @Kangaroo: Hatten wir schon. :D

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Private y As Integer = 28
    2. Private Sub btnAusgabeDazu_Click(sender As System.Object, e As System.EventArgs) Handles btnAusgabeDazu.Click
    3. y += 28
    4. ' ...
    Ich denke eher, dass der TE lernresistent ist. :S
    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-xperiment:
    mit kopiert und angepasst meine ich, dass der Tab "Einnahmen" mit dem Tab "Ausgaben" identisch ist, abgesehen natürlich von den Control-Namen. Als das dynamische Hinzufügen der Controls geklappt hatte, hatte ich den (zu dem Zeitpunkt) funktionierenden Code in die btnEinnahmeHinzu_Click-Prozedur kopiert und nur die Control-Bezeichnungen entsprechend geändert. Seitdem werden die dynamisch hinzugefügten Controls nicht mehr korrekt angezeigt.

    @Kangaroo:
    Die Variablen sind global im Klassen-Kopf vor der ersten Sub deklariert, ZählerNameA ist jetzt Integer, aber dem Problem bin ich immer noch auf der Spur. :( Die AddHandler's sind eigentlich nicht nötig, da die Felder nur ausgelesen werden und in ein DataSet eingefügt werden (das füge ich aber erst ein, wenn ich das Anzeigeproblem gelöst habe, um Fehlerquellen zu minimieren und ausschließen zu können). Ich werd's mit nem TableLayoutPanel probieren, vielleicht funzt es ja. :)

    @RodFromGermany:
    TE? :?:

    Gwenny schrieb:

    TE?
    der ThreadErsteller, in diesem Falle Du.
    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 werd's mit nem TableLayoutPanel probieren, vielleicht funzt es ja.
    Ersteinmal würde ich an Deiner Stelle den bestehenden Fehler finden, Du hast unter Garantie noch einen Bug drin. Nimm den Debugger und geh den Code beim Anlegen der 2. Zeile im Einzelschrittverfahren durch. Dann findet sich das Problem sehr schnell.

    Wenn der Fehler behoben ist, kannst Du immer noch Alternativen ausprobieren.
    Sieh Dir meinen Post #6 an, der lief mit der von mir geposteten Änderung Deines Codes.
    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!
    @RodFromGermany:
    Hoffentlich nicht :wacko:

    Und auch der besagte Thread #6 bewirkt leider nichts. Es liegt auch nicht an den Abständen o.Ä. Die neuen Controls befinden sich dort, wo sie sein sollen (rutschen also immer eine Zeile nach unten). Nur die Controls, die vorher dynamisch per Button-Klick erstellt wurden, verschwinden (nur optisch?), sobald der Button erneut geklickt wird. ?(

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

    Ich werd's jetzt mit der (optisch weit weniger ansprechenden) Lösung versuchen, mit einem DataGrid, das sollte funzen.

    @vb-xperiment:
    Nein, die Tabs "Einnahmen" und "Ausgaben" haben unterschiedliche Variablen. Außerdem ist der gesamte Code des Tabs "Einnahmen" auskommentiert.