ChangeEvent von mehreren Textboxen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.
-
-
DerSmurf schrieb:
wenn ich versuche auf "backspace" zu prüfen
Wenn Du den Namen einer Taste suchst, mach Dir ein separates Projekt mitTextBox
undLabel
und dannFalls 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! -
Danke VB1963, das mit dem Binden klingt gut - werde ich nachher mal googlen und versuchen umzusetzen.
Wenn nur mit numerical up and down in Binding als Double möglich ist, überlege ich mir das nochmal.
Aber mich stören die beiden hoch und runter Pfeile schon extrem, ich finde keine Möglichkeit diese zu deaktivieren.
Ansonsten verwende ich den Code vom Rod (der in Textbox nur numerische Eingabe und Backspace zulässt) und speichere die Zeit eben als String.
Ist ja kein Aufwand dann bei jedem Zugriff über Integer.Parse eine integer draus zu machen (so werden die Werte bisher gespeichert)
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerSmurf“ ()
-
Wenn die Pfeile bei den NUD's auch stören, du kannst genauso Eingaben machen, wie bei den Textboxen - benutze sie einfach nicht...
An Settings binden - da hat @ErfinderDesRades ein schönes Tutorial verfasst:
Settings richtig verwenden + an Settings binden -
Huhu
Danke für den Link, hat mir das googlen gespart :o)
Ich habe die restlichen beiden Elemente in meiner Einstellungen Form (eine Checkbox und ein Numeric up and down) nun an die Settings gebunden.
Weil die NUD ja nunmal das richige Control für meinen Zweck ist, wollte ich meine 18 Textboxen löschen und durch NUDs erstzen (und halt mit den Pfeilen leben), diese wollte ich dann an die entsprechenden Settings binden. Btw ich kann NUDs nur an Decimal Settings binden, nicht an double.
Aber hierzu leider noch eine Grundsatzfrage am konkreten Beispiel:
My.Settings.Temp95 (decimal) speichert die Sekunden, zusammengesetzt aus den beiden Textboxen Temp95Min und Temp95Sek
Mit diesem Code fällt ja das Binding weg, denn ich kann ja nicht zwei Textboxen (oder eben NUDs) an eine Setting binden
Nun meine Grundsatzfrage:
Ist es sinnvoller möglichst wenig in my.Settings zu speichern, oder ist das wurscht?
Soll ich also statt Temp95 in Sekunden, durch Temp95 Minuten UND Sekunden ersetzen, und dann in Sekunden umrechnen, wenn ich es brauche, oder ist es besser dies direkt so zu speichern, wie ich es später verwenden werde?
edit: @RodFromGermany Danke für den Tipp!
edit2: Hier ein wenig Code:
Der Code zum lesen und speichern von My.Settings in der Einstellungen Form:
Spoiler anzeigen Quellcode
- Private Abkuehlzeitgeaendert As Boolean = False
- 'Form Load Event
- Private Sub fProgrammeinstellungen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- 'Laden der Einstellungen aus My.Settings
- 'Abkühlzeiten
- Abkuehlzeitschreiben(My.Settings.Temp95, TB95Min, TB95Sek)
- Abkuehlzeitschreiben(My.Settings.Temp90, TB90Min, TB90Sek)
- Abkuehlzeitschreiben(My.Settings.Temp85, TB85Min, TB85Sek)
- Abkuehlzeitschreiben(My.Settings.Temp80, TB80Min, TB80Sek)
- Abkuehlzeitschreiben(My.Settings.Temp75, TB75Min, TB75Sek)
- Abkuehlzeitschreiben(My.Settings.Temp70, TB70Min, TB70Sek)
- Abkuehlzeitschreiben(My.Settings.Temp65, TB65Min, TB65Sek)
- Abkuehlzeitschreiben(My.Settings.Temp60, TB60Min, TB60Sek)
- End Sub
Quellcode
- 'Klick Events Buttons
- Private Sub btnSpeichern_Click(sender As Object, e As EventArgs) Handles btnSpeichern.Click
- 'Speichern in My.Settings
- 'Abkuehlzeiten nur speichern, wenn globale boolean True
- If Abkuehlzeitgeaendert = True Then
- My.Settings.Temp95 = Integer.Parse(TB95Min.Text) * 60 + Integer.Parse(TB95Sek.Text)
- My.Settings.Temp90 = Integer.Parse(TB90Min.Text) * 60 + Integer.Parse(TB90Sek.Text)
- My.Settings.Temp85 = Integer.Parse(TB85Min.Text) * 60 + Integer.Parse(TB85Sek.Text)
- My.Settings.Temp80 = Integer.Parse(TB80Min.Text) * 60 + Integer.Parse(TB80Sek.Text)
- My.Settings.Temp75 = Integer.Parse(TB75Min.Text) * 60 + Integer.Parse(TB75Sek.Text)
- My.Settings.Temp70 = Integer.Parse(TB70Min.Text) * 60 + Integer.Parse(TB70Sek.Text)
- My.Settings.Temp65 = Integer.Parse(TB65Min.Text) * 60 + Integer.Parse(TB65Sek.Text)
- My.Settings.Temp60 = Integer.Parse(TB60Min.Text) * 60 + Integer.Parse(TB60Sek.Text)
- End If
- Me.Close()
- End Sub
und hier die Verwendung dieser Settings im Programm.
lblTemperatur ist ein Label, einstellbar zwischen 100 und 60 in 5er Schritten durch zwei buttons.
lblAbkuehlzeitMin und lblAbkuehlzeitSek sind zwei Label für die Abkühlzeit des Wassers in Minuten und Sekunden:
Spoiler anzeigen Quellcode
- 'Change Events
- Private Sub lblTemperatur_TextChanged(sender As Object, e As EventArgs) Handles lblTemperatur.TextChanged
- 'Temperatur aus lblTemperatur auslesen und Abkuehlzeit entsprechend ändern
- Dim Temperatur As Integer = Integer.Parse(lblTemperatur.Text)
- Select Case Temperatur
- Case = 100 : TemperaturinZeit(0)
- Case = 95 : TemperaturinZeit(My.Settings.Temp95)
- Case 90 : TemperaturinZeit(My.Settings.Temp90)
- Case = 85 : TemperaturinZeit(My.Settings.Temp85)
- Case = 80 : TemperaturinZeit(My.Settings.Temp80)
- Case = 75 : TemperaturinZeit(My.Settings.Temp75)
- Case = 70 : TemperaturinZeit(My.Settings.Temp70)
- Case = 65 : TemperaturinZeit(My.Settings.Temp65)
- Case 60 : TemperaturinZeit(My.Settings.Temp60)
- End Select
- End Sub
Quellcode
- Private Sub TemperaturinZeit(Zeit As Integer)
- 'Sub zum ändern der Abkühlzeit je nach Temperatur
- If Zeit >= 60 Then
- 'Umwandeln der Sekunden in Minuten und Sekunden
- lblAbkuehlzeitMinuten.Text = (Zeit \ 60).ToString
- lblAbkuehlzeitSekunden.Text = (Zeit Mod 60).ToString
- Else
- lblAbkuehlzeitSekunden.Text = Zeit.ToString
- End If
- End Sub
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DerSmurf“ ()
-
Einige Fragen zu deinem Unterfangen, wenn ich die Textboxen von Temp60 bis 95 immer anschaue:
Hat das einen bestimmten Grund diese Temperatur in 5Grad-Schritten abgesetzt darzustellen?
Genügt es nicht, diesen Wert in einer einzigen Textbox zu zeigen?
Oder versteckt sich hier eine unbewusste Tabelle?
Kannst du von deiner Form ein Bildchen zeigen?Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()
-
@DerSmurf Trenne Daten und GUI.
Du rechnest mit dem Inhalt von TextBoxen. Das ist suboptimal, z.B. wenn Du Fehler suchst.
Halte Daten in Variablen entsprechenden Typs, die kannst Du dann auch in Settings ablegen:System.TimeSpan
. Da hast Du einen Wert, von dem Du die Stunden, Minuten und Sekunden abfragen kannst.
Und wnn Du Dir ein geeignetes Control baust, hast Du sehr viel weniger Aufwand mit Deinen Berechnungen.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! -
Habe ein Bild der Hauptform, sowie der Einstellungen Form hochgeladen.
Erklärung was da was tut ist auf den Bildern.
Hintergrund der Geschichte ist, dass ich, sobald das Problem hier geklärt ist, eine Speichermöglichkeit für verschiedene Tee Sorten (Name, Temperatur und Ziehzeit) mit Auswahl hinzufügen möchte (dann habe ich durch dieses Projekt recht viel neues gelernt)
Und zum Verständnis, was das so soll hier ein Beispiel an einem meiner Lieblingstees:
Name: Le Touareg
Temperatur: 90°
Ziehzeit: 2 Min
Also klicke ich zweimal auf den Minusbutton bei Temperatur um 90° einzustellen, die mein Wasser haben sollte.
Es ändern sich die entsprechenden Labels für Abkühlzeit.
Danach stelle ich die Ziehzeit aus 2 Min und starte.
Eine neue Form mit Timer (Abkühlzeit) zeigt sich und beginnt zu laufen. Ist der Timer auf 0 gibts eine Meldung welche bestätigt werden möchte.
Erfolgt dies wird die Timerform geschlossen und eine neue Instanz dieser geöffnet, diesmal mit Timer für die Ziehzeit.
Nun möchte ich diese Abkühlzeiten (im Bereich 95° - 60° - drunter macht wenig Sinn für Tee) einstellbar machen.
Wie erwähnt nicht über Sinn- oder Unsinn der Funktionalität nachdenken - mit gehts ums lernen, ich will Settings speichern.
So und hier dann noch der Code aus den beiden Forms (den Timer an sich - separate Form - habe ich jetzt mal weggelassen, denke mir der spielt keine Rolle, reiche ich aber gerne nach)
Code der Hauptform:
Spoiler anzeigen Quellcode
- Public Class fEinstellungen
- 'Klick Events - Buttons
- Private Sub btnTemperaturMinus_Click(sender As Object, e As EventArgs) Handles btnTemperaturMinus.Click
- 'verringert Temperatur um 5°
- Temperaturaendern(-5)
- End Sub
- Private Sub btnTemperaturPlus_Click(sender As Object, e As EventArgs) Handles btnTemperaturPlus.Click
- 'erhöht Temperatur um 5°
- Temperaturaendern(5)
- End Sub
- Private Sub btnZiehzeitPlus_Click(sender As Object, e As EventArgs) Handles btnZiehzeitPlus.Click
- 'Ziehzeit erhöhen
- Ziehzeitaendern("+")
- End Sub
- Private Sub btnZiehzeitMinus_Click(sender As Object, e As EventArgs) Handles btnZiehzeitMinus.Click
- 'Ziehzeit verkürzen
- Ziehzeitaendern("-")
- End Sub
- Private Sub btnstart_Click(sender As Object, e As EventArgs) Handles btnstart.Click
- 'Sub zum starten des Timers
- 'Ziehzeit in Sekunden umrechnen
- Dim ZiehSekunden As Integer = Integer.Parse(lblZiehzeitSekunden.Text)
- Dim ZiehMinuten As Integer = Integer.Parse(lblZiehzeitMinuten.Text)
- Dim Ziehzeit As Integer = ZiehSekunden + ZiehMinuten * 60
- 'wenn keine Zeit vergeben wurde, abbruch der Sub
- If Ziehzeit = 0 Then
- MessageBox.Show("Bitte Ziehzeit eingeben.")
- Exit Sub
- End If
- 'Temperaturzeit in Sekunden umrechnen
- Dim AbkuehlSekunden As Integer = Integer.Parse(lblAbkuehlzeitSekunden.Text)
- Dim AbkuehlMinuten As Integer = Integer.Parse(lblAbkuehlzeitMinuten.Text)
- Dim Abkuehlzeit As Integer = AbkuehlSekunden + AbkuehlMinuten * 60
- 'aktuelle Form ausblenden
- Me.Hide()
- 'Wenn Abkühlzeit größer als 0, dann zeigen der Form fTimer Abkühlen
- If Abkuehlzeit > 0 Then
- Dim frmAbkuehlzeit As New fTimer
- With frmAbkuehlzeit
- .Zeit = Abkuehlzeit
- .Ziehen = False
- .ShowDialog(Me)
- End With
- End If
- 'zeigen der Form fTimer für die Ziehzeit
- Dim frmZiehzeit As New fTimer
- With frmZiehzeit
- .Zeit = Ziehzeit
- .Ziehen = True
- .ShowDialog(Me)
- End With
- Me.Show()
- End Sub
- Private Sub btnbeenden_Click(sender As Object, e As EventArgs) Handles btnbeenden.Click
- 'Sub zum beenden des Programms
- Me.Close()
- End Sub
- 'Klick Events - MenuStrip1
- Private Sub BeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BeendenToolStripMenuItem.Click
- Me.Close()
- End Sub
- Private Sub EinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EinstellungenToolStripMenuItem.Click
- Dim frmEinstellungen As New fProgrammeinstellungen
- frmEinstellungen.Show(Me)
- End Sub
- 'Change Events
- Private Sub lblTemperatur_TextChanged(sender As Object, e As EventArgs) Handles lblTemperatur.TextChanged
- 'Temperatur aus lblTemperatur auslesen und Abkuehlzeit entsprechend ändern
- Dim Temperatur As Integer = Integer.Parse(lblTemperatur.Text)
- Select Case Temperatur
- Case = 100 : TemperaturinZeit(0)
- Case = 95 : TemperaturinZeit(My.Settings.Temp95)
- Case 90 : TemperaturinZeit(My.Settings.Temp90)
- Case = 85 : TemperaturinZeit(My.Settings.Temp85)
- Case = 80 : TemperaturinZeit(My.Settings.Temp80)
- Case = 75 : TemperaturinZeit(My.Settings.Temp75)
- Case = 70 : TemperaturinZeit(My.Settings.Temp70)
- Case = 65 : TemperaturinZeit(My.Settings.Temp65)
- Case 60 : TemperaturinZeit(My.Settings.Temp60)
- End Select
- End Sub
- 'Subs und Funktionen
- Private Sub Temperaturaendern(Faktor As Integer)
- 'Sub zum ändern der Temperatur
- Dim Temperatur As Integer = Integer.Parse(lblTemperatur.Text)
- Temperatur = Temperatur + Faktor
- If Temperatur > 100 OrElse Temperatur < 60 Then Exit Sub
- lblTemperatur.Text = Temperatur.ToString
- End Sub
- Private Sub Ziehzeitaendern(op As String)
- 'Intervall aus den Einstellungen lesen
- Dim Intervall As Decimal = My.Settings.Zeitintervall
- Dim Sekunden As Decimal = Integer.Parse(lblZiehzeitSekunden.Text)
- Dim Minuten As Integer = Integer.Parse(lblZiehzeitMinuten.Text)
- If op = "+" Then
- 'Sekunden erhöhen
- Sekunden = Sekunden + Intervall
- 'wenn Sekunden >= 60, dann Sekunden -60 und Minuten +1
- If Sekunden >= 60 Then
- Sekunden = Sekunden - 60
- Minuten = Minuten + 1
- End If
- Else
- 'Sekunden verringern
- 'Abbruch, wenn Minuten und Sekunden auf 0 stehen
- If Minuten = 0 AndAlso Sekunden = 0 Then Exit Sub
- Sekunden = Sekunden - Intervall
- 'wenn Sekunden < 0, dann Sekunden +60 und Minuten -1
- If Sekunden < 0 Then
- Sekunden = Sekunden + 60
- Minuten = Minuten - 1
- End If
- End If
- 'Minuten und Sekunden ggf mit voranstehender 0 in Labels schreiben
- If Minuten < 10 Then
- lblZiehzeitMinuten.Text = "0" & Minuten.ToString
- Else
- lblZiehzeitMinuten.Text = Minuten.ToString
- End If
- If Sekunden < 10 Then
- lblZiehzeitSekunden.Text = "0" & Sekunden.ToString
- Else
- lblZiehzeitSekunden.Text = Sekunden.ToString
- End If
- End Sub
- Private Sub TemperaturinZeit(Zeit As Integer)
- 'Sub zum ändern der Abkühlzeit je nach Temperatur
- If Zeit >= 60 Then
- 'Umwandeln der Sekunden in Minuten und Sekunden
- lblAbkuehlzeitMinuten.Text = (Zeit \ 60).ToString
- lblAbkuehlzeitSekunden.Text = (Zeit Mod 60).ToString
- Else
- lblAbkuehlzeitSekunden.Text = Zeit.ToString
- End If
- End Sub
- End Class
Code der Einstellungenform
Spoiler anzeigen Quellcode
- Public Class fProgrammeinstellungen
- 'Form Load Event
- Private Sub fProgrammeinstellungen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- 'Laden der Abkühlzeiten aus My.Settings
- Abkuehlzeitschreiben(My.Settings.Temp95, Nud95Min, Nud95Sek)
- Abkuehlzeitschreiben(My.Settings.Temp90, Nud90Min, Nud90Sek)
- Abkuehlzeitschreiben(My.Settings.Temp85, Nud85Min, Nud85Sek)
- Abkuehlzeitschreiben(My.Settings.Temp80, Nud80Min, Nud80Sek)
- Abkuehlzeitschreiben(My.Settings.Temp75, Nud75Min, Nud75Sek)
- Abkuehlzeitschreiben(My.Settings.Temp70, Nud70Min, Nud70Sek)
- Abkuehlzeitschreiben(My.Settings.Temp65, Nud65Min, Nud65Sek)
- Abkuehlzeitschreiben(My.Settings.Temp60, Nud60Min, Nud60Sek)
- End Sub
- 'Klick Events Buttons
- Private Sub btnSpeichern_Click(sender As Object, e As EventArgs) Handles btnSpeichern.Click
- 'Speichern in My.Settings
- 'Abkuehlzeiten nur speichern, wenn globale boolean True
- My.Settings.Temp95 = Integer.Parse(Nud95Min.Text) * 60 + Integer.Parse(Nud95Sek.Text)
- My.Settings.Temp90 = Integer.Parse(Nud90Min.Text) * 60 + Integer.Parse(Nud90Sek.Text)
- My.Settings.Temp85 = Integer.Parse(Nud85Min.Text) * 60 + Integer.Parse(Nud85Sek.Text)
- My.Settings.Temp80 = Integer.Parse(Nud80Min.Text) * 60 + Integer.Parse(Nud80Sek.Text)
- My.Settings.Temp75 = Integer.Parse(Nud75Min.Text) * 60 + Integer.Parse(Nud75Sek.Text)
- My.Settings.Temp70 = Integer.Parse(Nud70Min.Text) * 60 + Integer.Parse(Nud70Sek.Text)
- My.Settings.Temp65 = Integer.Parse(Nud65Min.Text) * 60 + Integer.Parse(Nud65Sek.Text)
- My.Settings.Temp60 = Integer.Parse(Nud60Min.Text) * 60 + Integer.Parse(Nud60Sek.Text)
- Me.Close()
- End Sub
- 'Subs und Funktionen
- Private Sub Abkuehlzeitschreiben(Temp As Integer, NudMin As NumericUpDown, NudSek As NumericUpDown)
- If Temp >= 60 Then
- NudMin.Text = (Temp \ 60).ToString
- NudSek.Text = (Temp Mod 60).ToString
- Else
- NudSek.Text = Temp.ToString
- NudMin.Text = "0"
- End If
- End Sub
- End Class
@RodFromGermany:
Das scheint ja viel mehr Sinn zu machen, als mein Ansatz mit zwei Boxen pro Temperatur ...
Aber zum rechnen mit den Inhalten von Textboxen (oder mittlerweile Nuds):
Ist es immer strikt zu trennen? Also ich könnte ja in der Sub Variablen mit den Inhalten belegen und dann damit rechnen, aber es das nicht bei meiner Pupsrechnung hier egal?
-
DerSmurf schrieb:
aber es das nicht bei meiner Pupsrechnung hier egal?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!
-
Ähnliche Themen
-
PictureBox-Bild je nach TextBox-Text
vb-programmer - - Sonstige Problemstellungen -
Text von mehreren Textboxen in Gesammtdatei speichern und öffnen
Shaymin123[CRI09] - - Sonstige Problemstellungen
-
4 Benutzer haben hier geschrieben
- VB1963 (11)
- DerSmurf (10)
- RodFromGermany (6)
- VaporiZed (2)