Erstelltes Element ansteuern

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Erstelltes Element ansteuern

    Hallo,
    ich habe zur zeit ein Problem erstellte Elemente per Code anzusteuern.

    VB.NET-Quellcode

    1. For cnt As Integer = 2 To 0 Step -1
    2. Dim LBL As New Label
    3. LBL.Name = "lbl_" & cnt
    4. LBL.Location = New Point(10, 10 + (cnt * 30))
    5. LBL.Size = New Size(15, 15)
    6. If cnt = 0 Then LBL.Text = "H"
    7. If cnt = 1 Then LBL.Text = "M"
    8. If cnt = 2 Then LBL.Text = "S"
    9. Me.Controls.Add(LBL)
    10. For cntt As Integer = 5 To 0 Step -1
    11. Dim digit As New RadioButton
    12. digit.Name = "rbt_" & cnt & cntt
    13. digit.Location = New Point(40 + (cntt * 20), 10 + (cnt * 30))
    14. digit.Size = New Size(10, 10)
    15. If cnt = 0 Then
    16. If cntt = 0 Then digit.Visible = False
    17. End If
    18. Me.Controls.Add(digit)
    19. Next
    20. Next


    Ich würde nun gerne z.b. Eigenschaften von rbt_20 verändern.
    Jedoch da dieser noch nicht existiert sondern erst noch erstellt wird kann ich diesen nicht ansteuern.
    Dachte erst an ein Usercontrol aber das löst mein Problem ja auch nicht.
    So geht das soweit ich weiß nicht.
    Man kann Steuerelemente nur Außerhalb eines Subs mit Events erstellen.
    Das Sähe dann so aus:

    VB.NET-Quellcode

    1. Private WithEvents l As Label

    Damit könntest du auch von jedem Sub aus die Eigenschaften des Steuerelements verändern.
    @m9898:
    Das ganze geht sehrwohl, mach es einfach mal.
    Es gibt nämlich AddHandler
    @Joefish:
    Ich würde das ganze sofort in ein UserControl packen.
    Da kannst Du Deine Radiobutton gleich anständig gruppieren, mit einem Panel oder einer GroupBox.
    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!
    es gibt auch die Möglichkeit, ein Event zu erstellen,
    und dann unter der erstellung deiner Variablen kannst du diesem Event einen Handler hinzufügen,

    z.B. AddHandler digitt.Click, AdressOf PictureBox1_Click (oder wie halt dein Event heißt)

    in diesem event, kannst du das Objekt mit dem gerade gearbeitet wird mit sender ansprechen:

    z.B.: sender.Location = New Point(100, 100)

    Gruß Vitox
    Wenn ich weiß, dass ich in einem Programm dynamisch einen Button erstelle, kann ich natürlich primär solch eine Sub usw. bereitstellen.
    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!

    m9898 schrieb:

    Ja, aber damit hat man nur ein Event. Mit Private withevens hast du schon die ganze Pallette des Steuerelements.
    Mit AddHandler kann man auch keine Dynamisch erstellten Buttons machen, da man ja weder einen Sub, noch seinen Namen Dynamisch erstellen kann.

    hä?
    erstens, kannst du auch mit AddHandler dem Element alle möglichen Events zuweisen, du musst halt nur für jedes eine Zeile schreiben

    zweitens, natürlich kannst du das mit dynamischen Buttons machen, du nennst das Sub z.B. einfach x machst dann

    AddHandler deinButton.Click, AdressOf x

    ud arbeitest in dem Sub mit sender satt mit dem Namen deines Buttons

    Gruß Vitox
    Erstmal Danke für eure so schnellen Antworten.
    Ich habe gestern die ganze Zeit versucht eure Vorschläge in die Tat umzusetzen, doch es will einfach nicht wie ich möchte.
    Mit AddHandler wollte ich es auch versuchen aber ist keine richtige Methode eingefallen.

    Ich möchte eine Binäruhr schreiben ohne Elemente mit der Toolbox zu setzen.
    Das heißt meine Radiobuttons werden nicht angeklickt, sondern fungieren nur als Darstellung binärer Zahlen.
    Daher fällt es mir schwer eine geeignete Methode zu finden und so versuchte ich es mit withEvents was aber auch nicht klappte..
    Es fällt mir einfach ungemein schwer ohne Namen der Elemente diese anzusteuern.
    Habe auch schon alles gegoogled was ging jedoch war das nicht unbedingt von Erfolg gekrönt ^^
    Hier meine bisherigen Versuche (manches ist halb angefangen und dient nur zur Veranschaulichung meiner bisherigen Anstrengungen)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public WithEvents digit As System.Windows.Forms.RadioButton
    3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    4. 'Resize Window
    5. Me.Size = New Size(250, 120)
    6. 'create labels
    7. For cnt As Integer = 2 To 0 Step -1
    8. Dim LBL As New Label
    9. LBL.Name = "lbl_" & cnt
    10. LBL.Location = New Point(10, 10 + (cnt * 30))
    11. LBL.Size = New Size(15, 15)
    12. If cnt = 0 Then LBL.Text = "H"
    13. If cnt = 1 Then LBL.Text = "M"
    14. If cnt = 2 Then LBL.Text = "S"
    15. Me.Controls.Add(LBL)
    16. Next
    17. 'For cnt As Integer = 0 To 2
    18. ' Dim zeit As New Label
    19. ' zeit.Name = "txtzeit_" & cnt
    20. ' zeit.Location = New Point(200, 10 + (30 * cnt))
    21. ' zeit.Size = New Size(50, 15)
    22. ' zeit.Enabled = True
    23. ' Select Case zeit
    24. ' Case 0
    25. ' zeit.Text = h
    26. ' Case 1
    27. ' zeit.Text = m
    28. ' Case 2
    29. ' zeit.Text = s
    30. ' End Select
    31. ' Me.Controls.Add(zeit)
    32. 'Next
    33. 'Timer
    34. Timer1.Start()
    35. End Sub
    36. Private Sub render_digits(ByVal hour As Integer, ByVal minute As Integer, ByVal second As Integer)
    37. For cnt As Integer = 2 To 0 Step -1
    38. For cntt As Integer = 5 To 0 Step -1
    39. Dim digit As New RadioButton
    40. digit.Name = "rbt_" & cnt & cntt
    41. digit.Location = New Point(40 + (cntt * 20), 10 + (cnt * 30))
    42. digit.Size = New Size(10, 10)
    43. Me.Controls.Add(digit)
    44. Next
    45. Next
    46. End Sub
    47. Public Function Decimal2Binary(ByVal Dec As Integer) As String
    48. Return Convert.ToString(Dec, 2)
    49. End Function
    50. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    51. Dim h As Integer = My.Computer.Clock.LocalTime.Hour
    52. Dim m As Integer = My.Computer.Clock.LocalTime.Minute
    53. Dim s As Integer = My.Computer.Clock.LocalTime.Second
    54. Label1.Text = Me.Decimal2Binary(h).ToString
    55. Label2.Text = Me.Decimal2Binary(m).ToString
    56. Label3.Text = Me.Decimal2Binary(s).ToString
    57. render_digits(h, m, s)
    58. End Sub
    59. End Class


    Den Timer und die Labels in denen ich die Zeit binär darstelle habe ich mit Hilfe der Toolbox erstellt.
    Habe mir den Designer Code auch angesehen, jedoch werden dort im Gegensatz zu mir feste Namen für Labels wie "Label1" benutzt.
    Okay.. Ich komm wirklich nicht aufs verrecken drauf..
    Habe jetzt ne Möglichkeit gefunden jedoch erstelle ich dann jeden Tick die Radiobutton erneut.
    Und das ich wirklich nicht Sinn der Sache..
    Außerdem bin ich mir natürlich bewusst dass ich mir alle Möglichen events für Radiobuttons ankucken kann.
    Doch wie ich bereits schon in meinem Vorpost sagte, habe ich keine gefunden die angebracht wäre, da diese sich nur auf die Veränderung und nicht aufs Verändern beziehen.
    Bitte sagt mir wie ich es machen soll. Ich bin es leid seit 2 Tagen 1000 von Seiten durchzulesen, die zum Schluss doch nichts zur Lösung betragen.