Hallo mal wieder und allen "Frohe Weihnachten".
ich schlage mich mit einem lästigen Thema herum und finde im VB.Net keine schöne Lösung.
Zum Thema: Ich bastel eine von mir erstellte Excel-VBA Datei nun ins VB.Net. (Im Excel VBA habe ich mein Problem gelöst, indem ich Worksheet Change benutzt habe).
Problembeschreibung:
Ich möchte Fehleingaben verhindern!
1) Einzelne TextBoxen: Dynamische Anzahl TextBoxen müssen "positive, ganze Zahlen" sein.
2) Doppelte TextBoxen: beide TB wie 1), aber zusätzlich muss die rechte TB um eins größer sein.
Beispiel: Links steht eine 4, dann sollte rechts eine 5 eingetragen werden.
Gegenbeispiel: Wenn rechts eine 3 eingetragen wird, dann muss sich die linke TB eine 2 bekommen (Wechselwirkung)
Grundaufbau:
Es gibt ein Panel, worin ich untereinander mehrere GroupBoxen gepackt habe.
Die sich darin befindenden Labels und TextBoxen werden zur Laufzeit erzeugt und können beliebig viele sein.
In die einzelnen TextBoxen mit der Überschrift "Anzahl" darf der User nur positive ganze Zahlen eintragen. Alles andere soll ignoriert werden. (C&P sollte erlaubt sein).
Bei den doppelten TextBoxen ist das genauso, allerdings haben die eine Wechselwirkung.
Egal in welches Feld man etwas einträgt, das zugehörige soll automatisch ausgefüllt werden. In diesem Fall soll die linke TB immer eins kleiner sein, wie die rechte TB.
Wenn aber manuell beide ausgefüllt werden, so muss die linke kleiner bleiben, aber es darf auch ein größerer Wertunterschied werden (z.B. links 4 zu rechts 14).
Genug davon. Schaut Euch bitte mal meinen beigefügten Screenshot an, dann wird es verständlich. THX !
Mein abgespeckter Code sieht so aus:
Ihr seht also, dass meine TextBoxen einen eindeutigen Namen besitzen, der hinten hochgezählt wird und in diesem Falle in der GrouBox "GrpBoxFlotte" ist.
Zur Information: Mein bisheriger Code mag gefallen oder nicht, aber die Datei arbeitet so wie sie soll.
Mir fehlt jetzt nur noch obiges Thema, um die Datei Userfreundlich zu haben.
Um die Wechselwirkung der beiden nebeneinanderstehenden TB zu behandeln hatte ich in Excel folgende Formel:
Nur, wie bekomme ich alle TextBoxänderungen überwacht? Ein Globales "Irgendetwas TextChanged" finde ich nicht.
und folgendes ist als Idee zwar ein Anfang, aber nur für feste Anzahlen von TB geeignet.
Ich würde mich freuen, wenn sich jmd findet, der mir aus diesem Dilemma hilft
Mir ist schon klar, dass die Lösung vermutlich extrem einfach sein wird. Aber das ist es halt immer, wenn man sie kennt.
In diesem Sinne schonmal: DANKE !
DragonRE
ich schlage mich mit einem lästigen Thema herum und finde im VB.Net keine schöne Lösung.
Zum Thema: Ich bastel eine von mir erstellte Excel-VBA Datei nun ins VB.Net. (Im Excel VBA habe ich mein Problem gelöst, indem ich Worksheet Change benutzt habe).
Problembeschreibung:
Ich möchte Fehleingaben verhindern!
1) Einzelne TextBoxen: Dynamische Anzahl TextBoxen müssen "positive, ganze Zahlen" sein.
2) Doppelte TextBoxen: beide TB wie 1), aber zusätzlich muss die rechte TB um eins größer sein.
Beispiel: Links steht eine 4, dann sollte rechts eine 5 eingetragen werden.
Gegenbeispiel: Wenn rechts eine 3 eingetragen wird, dann muss sich die linke TB eine 2 bekommen (Wechselwirkung)
Grundaufbau:
Es gibt ein Panel, worin ich untereinander mehrere GroupBoxen gepackt habe.
Die sich darin befindenden Labels und TextBoxen werden zur Laufzeit erzeugt und können beliebig viele sein.
In die einzelnen TextBoxen mit der Überschrift "Anzahl" darf der User nur positive ganze Zahlen eintragen. Alles andere soll ignoriert werden. (C&P sollte erlaubt sein).
Bei den doppelten TextBoxen ist das genauso, allerdings haben die eine Wechselwirkung.
Egal in welches Feld man etwas einträgt, das zugehörige soll automatisch ausgefüllt werden. In diesem Fall soll die linke TB immer eins kleiner sein, wie die rechte TB.
Wenn aber manuell beide ausgefüllt werden, so muss die linke kleiner bleiben, aber es darf auch ein größerer Wertunterschied werden (z.B. links 4 zu rechts 14).
Genug davon. Schaut Euch bitte mal meinen beigefügten Screenshot an, dann wird es verständlich. THX !
Mein abgespeckter Code sieht so aus:
Quellcode
- Private Sub frmBaukosten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Dim i As Integer
- Dim IntZeilenPosition As Integer
- Dim IntGrpBoxHight As Integer
- Dim IntTabIndex As Integer
- ' XML-Datei einlesen lassen
- Call dataset_BAD()
- Call dataset_style()
- Me.BackColor = Color.FromName(ds_style.Tables("Form").Rows(0).Item("BackColor"))
- IntGrpBoxHight = 0
- IntZeilenPosition = 40
- For i = 0 To ds.Tables("Flotte").Rows.Count - 1
- ' Label Schiffs-Typ erstellen
- lbl_Flotte = New Label
- With lbl_Flotte
- .Name = "lbl_Flotte" & i
- .Left = 15
- .Top = IntZeilenPosition
- .BackColor = Color.FromName(ds_style.Tables("StyleLabel").Rows(0).Item("BackColor"))
- .Size = New System.Drawing.Size(150, 20)
- .Text = ds.Tables("Flotte").Rows(i).Item("Typ")
- .TextAlign = ContentAlignment.MiddleLeft
- .BorderStyle = BorderStyle.FixedSingle
- Me.GrpBoxFlotte.Controls.Add(lbl_Flotte)
- End With
- ' TextBoxen "Anzahl" für die Schiffs-Typ erstellen
- txt_Flotte = New TextBox
- With txt_Flotte
- .Name = "txt_Flotte" & i
- .Left = 170
- .Top = IntZeilenPosition
- .TabIndex = IntTabIndex
- .BackColor = Color.FromName(ds_style.Tables("StyleTextBox").Rows(0).Item("BackColor"))
- .Size = New System.Drawing.Size(75, 20)
- .TextAlign = HorizontalAlignment.Right
- .BorderStyle = BorderStyle.FixedSingle
- Me.GrpBoxFlotte.Controls.Add(txt_Flotte)
- End With
- ' usw, usw
- End Sub
Ihr seht also, dass meine TextBoxen einen eindeutigen Namen besitzen, der hinten hochgezählt wird und in diesem Falle in der GrouBox "GrpBoxFlotte" ist.
Zur Information: Mein bisheriger Code mag gefallen oder nicht, aber die Datei arbeitet so wie sie soll.
Mir fehlt jetzt nur noch obiges Thema, um die Datei Userfreundlich zu haben.
Um die Wechselwirkung der beiden nebeneinanderstehenden TB zu behandeln hatte ich in Excel folgende Formel:
Quellcode
- 'aktuelle Stufe überwachen
- If Not Intersect(Target, rngAktStufe) Is Nothing Then
- For Each rng In Intersect(Target, rngAktStufe).Cells
- If Not IsNumeric(rng) Then
- rng.Value = ""
- rng.Offset(0, 1) = ""
- ElseIf rng > 0 And rng.Offset(0, 1) <= rng Then
- rng.Offset(0, 1).Value = rng.Value + 1
- ElseIf rng = 0 And rng.Offset(0, 1) >= 1 Then
- 'mach nix
- ElseIf rng = 0 Then
- rng.Offset(0, 1) = 1
- End If
- Next rng
- End If
- 'Zielstufe überwachen
- If Not Intersect(Target, rngZielStufe) Is Nothing Then
- For Each rng In Intersect(Target, rngZielStufe).Cells
- If Not IsNumeric(rng) Then
- rng.Value = ""
- rng.Offset(0, -1) = ""
- ElseIf rng < 1 Then
- rng.Value = ""
- rng.Offset(0, -1) = ""
- ElseIf rng >= 1 And rng.Offset(0, -1) >= rng Then
- rng.Offset(0, -1).Value = rng.Value - 1
- ElseIf rng = 1 Then
- rng.Offset(0, -1) = 0
- End If
- Next rng
- End If
Nur, wie bekomme ich alle TextBoxänderungen überwacht? Ein Globales "Irgendetwas TextChanged" finde ich nicht.
und folgendes ist als Idee zwar ein Anfang, aber nur für feste Anzahlen von TB geeignet.
Ich würde mich freuen, wenn sich jmd findet, der mir aus diesem Dilemma hilft
Mir ist schon klar, dass die Lösung vermutlich extrem einfach sein wird. Aber das ist es halt immer, wenn man sie kennt.
In diesem Sinne schonmal: DANKE !
DragonRE