Das gute, alte Steuerelementefeld aus VB6

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von edel.

    Das gute, alte Steuerelementefeld aus VB6

    Hallo zusammen,
    gerade neu in diesem Forum und justemang frisch aus der Vergangenheit (VB6) eingetroffen, fange ich nun von vorne an,

    ich habe mal - eher schlecht, als recht - (noch unter VB6) ein paar Hilfen programmiert. Ich habe mich nie Programmierer genannt und werde es tunlichst auch sein lassen, es je zu tun.
    Aber nun hat mich die Realität dazu gezwungen, doch wieder ein Programm 'zurecht zu biegen', bis es etwas tut, wofür es bisher noch nix gibt....
    Aber eine genaue Schilderung würde zu weit führen.
    Darum hier nur das Problem, das mich immer wieder ereilt:
    Ich habe immer sehr gern mit dem guten, alten Steuerelementefeld gearbeitet, um Funktionen, Eingenschafts-Zuweisungen, etc. über For-To-Next-Schleifen zu erledigen.
    Da meine Anwendung über eine Unzahl von Buttons verfügt und denen zur Laufzeit nicht selten neue Eigenschaften zugewiesen werden müssen, bin ich nun traurig, weil es das SEfeld nicht mehr gibt.

    Helft mir bitte, - wenn möglich mit Sprache für einen VB6-Wiedereinsteiger, der jetzt mit Visual Studio 2019 arbeitet und nach 5 Jahren wieder anfängt, eine Möglichkeit zu finden, diese Umbenennungen durchzuführen.

    Hier eine Einfach-Einfach-Einfach-Darstellung meines Begehrs:

    For x = 1 to 60
    Steuerelement(x).text = "Ich bin das " & x & " . Steuerelement"
    next x

    (eben so (wie einst bei VB6) geht es ja nicht mehr. Wie mache ich so etwas jetzt (mit VS2019) ?)

    Vielen Dank für alles, was mit meinem Problem so passiert...

    Gruß und schönes Wochenende, edel

    *ich habe schon eine Möglichkeit gefunden.... zwar unter einem anderen Thema. Aber hab es so probiert und es funktioniert (zumindest für meinen Fall)

    VB.NET-Quellcode

    1. Me.Controls.Add(New ListBox)
    2. Dim o As Object = Me.Controls(0)


    Wenn doch irgendwelche Kommentare kommen, lese ich sie mit großer Aufmerksamkeit dennoch

    Gruß, edel


    *Thema verschoben* ~NoFear23m
    CodeTags gesetzt; die Farbe Rot ist der Moderation vorbehalten ~VaporiZed


    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „VaporiZed“ ()

    @edel Willkommen im Forum. :thumbup:
    Leider kenne ich zum Glück dieses Steuerelementefeld nicht.
    Du kannst natürlich im .NET-Designer mehrere Controls markieren und denen gemeinsam eine Reihe von Properties zuweisen.
    Poste mal einen Schnappschuss von Deiner (alten) GUI.
    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,

    ganz so einfach wie in VB6 geht das nicht mehr, zumindest hab ich es noch nicht rausgefunden.

    Man kann natürlich ein Array vom entsprechendem Typ machen und diesem dann die Elemente zuweisen, ahnlich dem Beispiel von dir mit Me.Controls.

    VB.NET-Quellcode

    1. Dim b(1) As Button
    2. b(0) = Button1
    3. b(1) = Button2
    4. MsgBox(b(1).Name)

    Noch besser natürlich man erstellt dann per Laufzeit die Controls wie in deinem Beispiel.


    Ich hab mir auch mal eine andere Lösung gebastelt.
    Die Steuerelemente die ich wie ein Feld ansprechen wollte, haben nach dem Namen einen Nummer bekommen.
    Dann hab ich alle Elemten in ein Dictionary gepakt mit dem Namen als Schlüssel.
    Dann konnte ich die Elemente per "Name_"+ Index ansprechen.

    In der Form:

    VB.NET-Quellcode

    1. Public con As New Dictionary(Of String, System.Windows.Forms.Control)
    2. Private Sub Software_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. ControlsLaden(Me.Controls)
    4. ...
    5. 'in einem Modul dann
    6. Public Sub ControlsLaden(cons As Object) ' Läd alle Controls in ein Auflistung, damit sie mit Ihrem Namen angesprochen werden können
    7. Dim c As Object
    8. For Each c In cons
    9. f.con(c.Name) = c
    10. If c.Controls.Count Then
    11. ControlsLaden(c.Controls)
    12. End If
    13. Next
    14. End Sub


    Der Aufruf ging dan so:
    Me.con("Button_" & x).Visible = False

    war für mich damals ein Workaround.

    CodeTags gesetzt ~VaporiZed

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

    SoEinVBler schrieb:

    VB.NET-Quellcode

    1. Public Sub ControlsLaden(cons As Object)
    Wenn Du Controls laden willst, dann lade sie auch als Controls!

    VB.NET-Quellcode

    1. Public Sub ControlsLaden(cons As Control)
    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!
    ControlCollection? Wenn, dann eher noch ein Control-Array (Control()), eine List(Of Control) oder allgemein ein IEnumerable(Of Control).
    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.

    edel schrieb:



    Hier eine Einfach-Einfach-Einfach-Darstellung meines Begehrs:

    For x = 1 to 60
    Steuerelement(x).text = "Ich bin das " & x & " . Steuerelement"
    next x



    vielleicht hilft dir das weiter

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Public ControlsTable As New Hashtable
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. Dim y As Integer = 0
    6. For i As Integer = 1 To 10
    7. Dim txt As New Button
    8. txt.Name = CStr(i)
    9. txt.Text = "Command" & i
    10. txt.Tag = i
    11. txt.Location = New Point(0, y)
    12. y = y + 25
    13. 'Event Clicked
    14. AddHandler txt.Click, AddressOf ClickMe
    15. ControlsTable.Add(txt.Name, txt)
    16. Me.Controls.Add(txt)
    17. Next
    18. End Sub
    19. Private Sub ClickMe(ByVal sender As System.Object, ByVal e As System.EventArgs)
    20. Dim buttonClicked As Button = DirectCast(sender, Button)
    21. MessageBox.Show("Clicked: " & buttonClicked.Name)
    22. End Sub
    23. End Class
    Ich übergebe ja

    VB.NET-Quellcode

    1. ControlsLaden(Me.Controls)

    im Debuger kommt bekomme im Überwachungsfenster Me.Controls {System.Windows.Forms.Form.ControlCollection} angezeigt.

    Da sich die Sub aber auch mit den "Unter-Controls" selbst aufruft, kam da auch ein Fehler, daher
    System.Windows.Forms.Control.ControlCollection

    Habe die 3 Varianten, mit meinem Wissen, getestet, kam aber jedes mal ein Fehler.

    edel schrieb:

    Steuerelement(x).text = "Ich bin das " & x & " . Steuerelement"


    Na ja, es geht schon. Wenn du deine Controls (hier buttons) so benennst: Button1, Button2, Button3,... etc.

    .NET hat in WinForms eine Funktion Controls.Find(string name, bool searchAllChildren). Diese kann man dann in einer Schleife durchlaufen, wenn man als name-Parameter dann "Button" & i übergibt
    Hallo nochmal,

    ich habe mir alles sorgfältig durchgelesen.
    Leider nicht alles sofort 'gecheckt'.... weil: Muss erst einmal wieder rein kommen.
    Aber alle eure Ansätze werden meinen vereinfachten Versuch noch verbessern/vereinfachen, - da bin ich sicher.
    Ich mnelde mich nochmal, wenn ich MEINE Lösung gefunden habe.

    Gruß, edel