Gibt es ein Ereignis einer Form in dem ich ermitteln kann von welcher TextBox der Inhalt geändert wurde?

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Duster.

    Gibt es ein Ereignis einer Form in dem ich ermitteln kann von welcher TextBox der Inhalt geändert wurde?

    Hallo zusammen,

    mein Problem ist folgendes. Ich habe eine Form mit 12! TextBoxen. Um den geänderten Inhalt einer TextBox weiterzugeben kann ich das TextChanged oder KeyDown etc.Ereignis einer TextBox nutzen. Dann müsste ich aber in allen 12 TextBoxen indem jeweiligen TextChanged oder KeyDown Ereignis die Änderung prüfen.

    Gibt es eine Möglichkeit (in dem Ereignis einer Form) zu prüfen welche TextBox ausgewählt wurde um deren Namen und Inhalt an eine Sub/ Funktion weiterzugeben die dann diese Daten entsprechend weiterverarbeitet?

    Hier ein kleiner Auszug, das Prg. hab ich angehängt:

    VB.NET-Quellcode

    1. Public Sub CheckTheBox()
    2. Dim boxName As String
    3. End Sub
    4. Private Sub TxtLine01StartX_KeyDown(sender As Object, e As KeyEventArgs) Handles TxtLine01StartX.KeyDown
    5. If e.KeyCode = Keys.Enter Then
    6. _linesCoords(0).X = Ctype(TxtLine01StartX.Text, Integer)
    7. TxtLine01StartY.Focus()
    8. End If
    9. Invalidate()
    10. End Sub


    Vielen Dank für Eure Mühe und Hilfe,
    Duster
    Dateien
    • AnimLines.zip

      (246,83 kB, 76 mal heruntergeladen, zuletzt: )
    @Duster Du kannst einem Eventhandler die entsprechenden Ereignisse beliebig vieler Controls zuweisen.
    Um die Controls zu unterscheiden, fragst Du dann den Parameter sender ab:

    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
    2. If sender.Equals(Button1) Then
    3. MessageBox.Show("Button1")
    4. ElseIf sender.Equals(Button2) Then
    5. MessageBox.Show("Button2")
    6. ElseIf sender.Equals(Button3) Then
    7. MessageBox.Show("Button3")
    8. End If
    9. End Sub
    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
    Danke das ist schon mal einen Schritt weiter.
    Ich habe dann aber wieder eine große Select bzw. If-Abfrage din.
    Ich dachte dass ich vielleicht eine Funktion wie die folgende oder eine ähnliche aus irgendeinem Form Ereignis aufrufen könnte oder dass es sonst einen Trick gibt eine große Select bzw. If-Abfrage zu vermeiden:

    VB.NET-Quellcode

    1. Public Function CheckTheBox(txtName As Control) As KeyEventArgs
    2. Dim e As KeyEventArgs = New KeyEventArgs(Keys.Enter)
    3. If e.KeyCode Then
    4. _linesCoords(0).X = Ctype(txtName.Text, Integer)
    5. txtName.Focus()
    6. End If
    7. Return e
    8. End Function


    Vielen Dank für Deine Hilfe,
    Duster
    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
    Oh Gott, das hatte ich schon wieder vergessen! :S
    Hatte gedacht ich hätte es im Studio so eingestellt dass es automatisch gesetzt wird!
    Aber an der Select/ If Sache änderts nix!

    Ich les jetzt die TextBoxen inne Liste und probiermal rum.
    Melde mich wenn's was positives gibt!

    Viele Grüße,
    Duster

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

    Du kannst es auch so gestalten:

    VB.NET-Quellcode

    1. Private Sub TextBox_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged, TextBox3.TextChanged
    2. Dim CurrentTextBox = DirectCast(sender, TextBox)
    3. ShowTextBoxNameAndContent(CurrentTextBox)
    4. End Sub
    5. Private Sub ShowTextBoxNameAndContent(TextBox As TextBox)
    6. MessageBox.Show($"Name: {TextBox.Name}, Inhalt: {TextBox.Text}")
    7. End Sub
    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.
    Hallo,
    ich hab Dank Eurer Hilfe die Sache jetzt so gelöst:

    VB.NET-Quellcode

    1. Private Sub Tb_X_0_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Tb_X_0.KeyPress,
    2. Tb_Y_0.KeyPress,
    3. Tb_X_1.KeyPress, Tb_Y_1.KeyPress, Tb_X_2.KeyPress,
    4. Tb_Y_2.KeyPress, Tb_X_3.KeyPress, Tb_Y_3.KeyPress,
    5. Tb_X_4.KeyPress, Tb_Y_4.KeyPress, Tb_X_5.KeyPress,
    6. Tb_Y_5.KeyPress
    7. Dim currentTextBox = DirectCast(sender, TextBox)
    8. CheckTheBox(e, currentTextBox)
    9. Invalidate()
    10. End Sub
    11. Public Sub CheckTheBox(e As KeyPressEventArgs, txtBox As TextBox)
    12. Dim tbIndex As Integer
    13. Dim tbName As String = txtBox.Name
    14. Dim delimitter() As String = tbName.Split(CChar("_"))
    15. tbIndex = CType(delimitter(2), Integer)
    16. If e.KeyChar = Chr(13) Then
    17. If delimitter(1) = "X" Then
    18. _linesCoords(tbIndex).X = Ctype(txtBox.Text, Integer)
    19. SendKeys.Send("{TAB}")
    20. Else
    21. _linesCoords(tbIndex).Y = Ctype(txtBox.Text, Integer)
    22. SendKeys.Send("{TAB}")
    23. End if
    24. End If
    25. txtTest.Text = CType(txtBox.TabIndex, String)
    26. End Sub


    Viele Grüße,
    Duster
    Dateien
    • AnimLines.zip

      (250,09 kB, 77 mal heruntergeladen, zuletzt: )
    @Duster Du solltest keine Informationen im Namen eines Controls ablegen.
    So bist Du gezwungen, die Namen dieser Controls nach einem Schema anzulegen.
    Nimm vielmehr die Property .Tag, die ist dafür gemacht, das iwelche zusätzlichen Informationen abgelegt werden können.
    .Tag ist vom Typ Object und wird im Designer als String abgelegt. Im Code kannst Du da zuweisen was immer Du benötigst, Zahlen, DataTables, Delimiter usw.
    Du musst es nur korrekt casten.
    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!
    Ganz kurz. Das CChar("_") kannst Du in "_"c ändern. Aber was soll das mit dem SendKeys? Ist das sowas wie: Gehe zum nächsten Control? Irgendwie werd ich das Gefühl nicht los, dass ein DGV die bessere Wahl für Dein Vorhaben ist. Was soll's denn im Gesamten werden? Das Ganze CType ist auch nicht so ganz VB.Net. CType(txtBox.TabIndex, String) -> txtBox.TabIndex.ToString, Ctype(txtBox.Text, Integer) -> Integer.Parse(txtBox.Text)
    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
    Das ganze soll ein kleines interaktives GDI+ Tutorial werden.
    An ein DGV hab ich auch schon gedacht und werde das später dahingehend ändern.
    Zunächst werde ich den Lösungsvorschlag von RodFromGermany (.Tag) weiterverfolgen wegen der "Learning Purposes".
    Mit dieser Property hatte ich noch nie was zu tun!.
    Ja, "SendKeys" ==> bei Enter Taste gehe zu nächster TextBox.
    CType() nicht so richtigVB.Net konform? Hmmmm, wusste ich nicht, dann nehme ich Deine Vorschläge dankend an!

    @RodFromGermany
    So sieht das auch viel besser aus, wenn dieTBoxen keine durch Unterstrich unterbrochene Namen haben:

    VB.NET-Quellcode

    1. Private Sub TxtX0_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtX0.KeyPress,
    2. TxtY0.KeyPress,
    3. TxtX1.KeyPress, TxtY1.KeyPress, TxtX2.KeyPress,
    4. TxtY2.KeyPress, TxtX3.KeyPress, TxtY3.KeyPress,
    5. TxtX4.KeyPress, TxtY4.KeyPress, TxtX5.KeyPress,
    6. TxtY5.KeyPress
    7. Dim currentTextBox = DirectCast(sender, TextBox)
    8. CheckTheBox(e, currentTextBox)
    9. Invalidate()
    10. End Sub
    11. Public Sub CheckTheBox(e As KeyPressEventArgs, txtBox As TextBox)
    12. Dim tbIndex As Integer
    13. Dim tbName As String = DirectCast(txtBox.Tag, String)
    14. Dim delimitter() As String = tbName.Split("_"c)
    15. tbIndex = Integer.Parse(delimitter(1))
    16. If e.KeyChar = Chr(13) Then
    17. If delimitter(0) = "X" Then
    18. _linesCoords(tbIndex).X = Integer.Parse(txtBox.Text)
    19. SendKeys.Send("{TAB}")
    20. Else
    21. _linesCoords(tbIndex).Y = Integer.Parse(txtBox.Text)
    22. SendKeys.Send("{TAB}")
    23. End if
    24. End If
    25. txtTest.Text = txtBox.TabIndex.ToString()
    26. End Sub

    ist nichtViele Grüße und danke für Deine Hilfe,
    Duster

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

    Duster schrieb:

    So sieht das auch viel besser aus, wenn dieTBoxen keine durch Unterstrich unterbrochene Namen haben:
    So funktioniert aber dieser Code nicht mehr:

    VB.NET-Quellcode

    1. Dim delimitter() As String = tbName.Split("_"c)
    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!
    So funktioniert es fast aber die Koordinaten des Anfangs-/ Endpunktes der letzten Linie werden durcheinandergeworfen
    Aber warum?
    Ich hab nochmal das geänderte Projekt angehängt!

    VB.NET-Quellcode

    1. Public Sub CheckTheBox(e As KeyPressEventArgs, txtBox As TextBox)
    2. Dim delimitter() As String = txtBox.Tag.ToString().Split("_"c)
    3. Dim tbIndex = Integer.Parse(delimitter(1))
    4. Dim tbName = delimitter(0)
    5. If e.KeyChar = Chr(13) Then
    6. If tbName = "X" Then
    7. _linesCoords(tbIndex).X = Integer.Parse(txtBox.Text)
    8. SendKeys.Send("{TAB}")
    9. Else
    10. _linesCoords(tbIndex).Y = Integer.Parse(txtBox.Text)
    11. SendKeys.Send("{TAB}")
    12. End if
    13. End If
    14. End Sub


    Vielen Dank für Eure Hilfe,
    Duster
    Dateien
    • AnimLines.zip

      (248,18 kB, 79 mal heruntergeladen, zuletzt: )
    @Duster Du kannst in den Tag ein "X" oder ein "Y" reinpacken.
    Aber:
    Mir scheint, dass Du mit je 2 TextBoxen x- und y-Werte vorgibst.
    Mach Dir ein UserControl mit 2 TextBoxen und pack die ganze Intelligenz da rein.
    Feddich.
    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
    Ich weiss nicht ob ich Dich richtig verstehe.
    Ich habe pro TextBox genau ein Tag. In dieses packe ich je nach TextBox ein Start "X_0...." oder ein Start "Y_0...." oder ein End "X_0...." oder ein End "Y_0....".
    Dann Parse ich nach X oder Y und der Nummer und behandle dann die Sache weiter.
    Es klappt ja auch bis zur letzten Linie :/ ????

    Duster schrieb:

    Ich weiss nicht ob ich Dich richtig verstehe.
    Wie viele von den x-y-Dingens gibt es?
    Poste mal nen Screenshot Deiner 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!
    @RodFromGermany
    x-y-Dingens?
    Es gibt 12 TextBoxen. Immer eine für die X-Koordinate des Anfangspunktes, eine für die Y-Koordinate des Endpunktes, eine für die Anfangskoordinate des Endpunktes eine für die Endkoordinate des Endpunktes einer Linie.
    Jede TextBox hat ein Tag entweder X_Nummer oder Y_Nummer je nachdem um was für eine Koordinate es sich handelt.
    Also gibt es 12 Tags 6 mal X_Nummen und 6 mal Y-Nummer!
    X_0, X_1....X_5 und Y_0, Y_0....Y5.

    Du kannst auch das Projekt von Post Nr.16 öffnen, das ist sehr klein und aufs wesentliche reduziert!
    Als ich die Namen der TextBoxen geparst habe hatt's auch funktionier. Mit der .Tag Propertie ist das wesentlich besser aber ich versteh einfach nicht wo der Unterschied/ Fehler liegt?


    Viele Grüße,
    Duster
    Dateien
    • ScreenShot.png

      (0 Byte, 54 mal heruntergeladen, zuletzt: )

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