Holla
Ich erzeuge anhand der Menge Einträge in einer DataTable dynamisch Textboxen. Diese Textboxen speichere ich dann in einer List of Controls, damit ich später leichter darauf zugreifen kann.
Es handelt sich beim Inhalt der DataTable um Warengruppen, welche durch die Textboxen eine Tageseinnahme zugewiesen bekommen. Das klappt alles.
Diese Textboxen möchte ich nun mithilfe eines TouchNumPads (also Button 0 bis 9, ein Komma, einmal Enter, und einmal Backslash) auf der gleichen Form beschreiben.
Zusätzlich zu den im Code erstellten Textboxen gibt es noch eine Per Designer erstellte (für die Kundenzahl) mit TabIndex 0.
Also ein Druck auf einen Zahlenbutton, soll die entsprechende Zahl in die Box schreiben (angefangen bei Kunden (TabIndex0)), beim Komma genauso.
Druck auf Enter soll dann ein Beschreiben der nächsten Box ermöglichen, oder, wenn keine Box mehr zum beschreiben da ist, denn "speichern" Button fokussieren, und beim erneuten druck den Button "klicken".
Also das gleiche Verhalten, als wenn ich mit der Tab Taste durchschalte.
Theoretisch müsste ich ja hierzu die aktive Textbox Klassenweit speichern, angefangen mit der ersten "Kunden", um diese dann entsprechend zu beschreiben.
Das wäre ja nicht das Problem, denn das kann ich ja über das Enter Event der Textbox lösen.
Wie aber realisiere ich dies, bei meinen dynamisch erstellten Textboxen?
Spoiler anzeigen
Das hier wäre mein Ansatz für die codeerstellte Textbox "kunden":
Nun kann ich ja auch ein Enter Event mit gleichem Inhalt für meine per Code erstellten Textboxen erstellen, aber das bekomme ich ja nicht ausgelöst.
Ich erzeuge anhand der Menge Einträge in einer DataTable dynamisch Textboxen. Diese Textboxen speichere ich dann in einer List of Controls, damit ich später leichter darauf zugreifen kann.
Es handelt sich beim Inhalt der DataTable um Warengruppen, welche durch die Textboxen eine Tageseinnahme zugewiesen bekommen. Das klappt alles.
Diese Textboxen möchte ich nun mithilfe eines TouchNumPads (also Button 0 bis 9, ein Komma, einmal Enter, und einmal Backslash) auf der gleichen Form beschreiben.
Zusätzlich zu den im Code erstellten Textboxen gibt es noch eine Per Designer erstellte (für die Kundenzahl) mit TabIndex 0.
Also ein Druck auf einen Zahlenbutton, soll die entsprechende Zahl in die Box schreiben (angefangen bei Kunden (TabIndex0)), beim Komma genauso.
Druck auf Enter soll dann ein Beschreiben der nächsten Box ermöglichen, oder, wenn keine Box mehr zum beschreiben da ist, denn "speichern" Button fokussieren, und beim erneuten druck den Button "klicken".
Also das gleiche Verhalten, als wenn ich mit der Tab Taste durchschalte.
Theoretisch müsste ich ja hierzu die aktive Textbox Klassenweit speichern, angefangen mit der ersten "Kunden", um diese dann entsprechend zu beschreiben.
Das wäre ja nicht das Problem, denn das kann ich ja über das Enter Event der Textbox lösen.
Wie aber realisiere ich dies, bei meinen dynamisch erstellten Textboxen?
VB.NET-Quellcode
- Dim TBList As New List(Of Control)
- Private Sub DrawControls()
- 'Anzahl der Warengruppen ermitteln
- Dim GroupCount As Integer
- GroupCount = DtsSettings.ProductGroup.Count
- 'abbrechen, wenn es keine Warengruppen gibt
- If GroupCount = 0 Then
- MessageBox.Show("Eitragen nicht möglich. - keine Warengruppen gespeichert.")
- Me.Close()
- Exit Sub
- End If
- Dim GroupName As String
- Dim yPosition As Integer = 190
- Dim xPosition As Integer = 12
- 'Controls für jede Warengruppe erzeugen
- For i = 1 To GroupCount
- 'Name aus BindingSource lesen
- Dim ProductGroup = DirectCast(DirectCast(ProductGroupBindingSource(i - 1), DataRowView).Row, DtsSettings.ProductGroupRow)
- GroupName = ProductGroup.Name
- 'Label
- Dim NewLBL = New System.Windows.Forms.Label
- With NewLBL
- .Location = New System.Drawing.Point(xPosition, yPosition)
- .Font = New Font("Microsoft Sans Serif", 12)
- .TextAlign = ContentAlignment.MiddleCenter
- .Name = "LBL " & GroupName
- .Size = New System.Drawing.Size(200, 20)
- .Text = GroupName
- .Visible = True
- End With
- 'TextBox
- Dim newTB = New System.Windows.Forms.TextBox
- With newTB
- .Location = New System.Drawing.Point(xPosition, yPosition + 23)
- .Font = New Font("Microsoft Sans Serif", 12)
- .Name = "TB " & GroupName
- .Size = New System.Drawing.Size(200, 26)
- .TabIndex = i
- .Visible = True
- AddHandler .TextChanged, AddressOf TextChangeEvent
- End With
- TBList.Add(newTB)
- 'Controls auf die Form malen
- Me.Controls.Add(NewLBL)
- Me.Controls.Add(newTB)
- 'Position für nächste Controls anpassen
- xPosition += 250
- If xPosition > 532 Then
- xPosition = 12
- yPosition += 70
- End If
- Next
- 'Höhe der Form anpassen
- If xPosition = 12 Then yPosition -= 70 'y verkleinern, wenn WG durch 3 teilbar ist, sonst zu groß
- Me.Height = yPosition + 140
- End Sub
Das hier wäre mein Ansatz für die codeerstellte Textbox "kunden":
VB.NET-Quellcode
-
- Dim SelectedBox As TextBox
- Private Sub TBCustomers_Enter(sender As Object, e As EventArgs) Handles TBCustomers.Enter
- Dim EnteredBox = DirectCast(sender, TextBox)
- SelectedBox = EnteredBox
- End Sub
- Private Sub NumBUtton_Click(sender As Object, e As EventArgs) Handles BTN9.Click, BTN8.Click, BTN7.Click, BTN6.Click, BTN5.Click, BTN4.Click, BTN3.Click, BTN2.Click, BTN1.Click, BTN0.Click
- Dim pressedbutton = DirectCast(sender, Button)
- SelectedBox.Text &= pressedbutton.Text
- End Sub
Nun kann ich ja auch ein Enter Event mit gleichem Inhalt für meine per Code erstellten Textboxen erstellen, aber das bekomme ich ja nicht ausgelöst.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerSmurf“ ()