Bitte um Bewertung meines zweiten Projektes - Tea Timer

    • Release
    • Open Source

    Es gibt 62 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

      Bei der Abkühlzeit hast du natürlich recht.
      Jedoch verwende ich immer den gleichen Becher (aber auch hier habe ich die Zeiten nie gemessen, sondern mir irgendwelche Werte aus dem Netz geholt, die auch nicht stimmen werden).
      Dafür gibt es ja in den Einstellungen die Möglichkeit die Abkühlzeiten zu ändern.
      Also der Gedanke dahinter ist, einmal Wasser zum kochen bringen, in den Becher rein und Thermometer rein.
      Dann in den Einstellungen, die entsprechenden Abkühlzeiten hinterlegen und alles passt dann für diesen einen Becher.
      Da ich wirklich IMMER aus dem gleichen Becher trinke, habe ich mir über andere Gefäße keine Gedanken gemacht.
      Ich mach mir aber mal Gedanken, wie man evtl. mehrere Gefäße mit deren Abkühlzeiten speichern kann und diese dann auswählt.

      Warum kann ich bei [neu] als Zeit 1 Minute 60 Sekunden einstellen?

      Das fällt in die Kategorie upsala. Habe ich nun im Designer auf maximal 59 geändert

      Das mit dem aus-den-Labels-Werte-rauspuhlen:

      ein kommplett neues DataSet würde sich ja dann jetzt hier geradezu aufdrängen.
      Dort speichere ich die entsprechenden Abkühlzeiten und mache im Designer eine Combobox, in der die Namen der Gefäße ausgewählt werden.
      So kann ich dann meine Labels "Abkühlzeit" aus dem DataSet befülen und die Werte beim Klick auf Start aus dem DataSet ziehen.
      "Temperatur in Zeit" Rechnungen brauche ich ja dann garnicht mehr.
      Ich kann mir gerade nur nicht vorstellen, wie das DataSet dann aussehen soll.
      Ich speichere Gefäßname und zu jeder Temperatur eine Abkühlzeit.
      Aber dann muss ich ja dem Gefäß "Tasse 200ml" mehrere Werte zuweisen. "Temp95" mit Abkühlzeit, "Temp90" mit Abkühlzeit usw.
      Gibt es da einen Trick?
      Gut, kein Problem, dann belass es erstmal bei Deinem Referenzbecher, später kann man es immer noch komplizierter machen.

      DerSmurf schrieb:

      Habe ich nun im Designer auf maximal 59 geändert
      Seh ich jetzt auch nicht als optimal an. Die ganzen Zeiten kann man in 30-Sekunden-Schritte einstellen. Dann mach es doch auch hier so. Lass einfach als valide Sekundenangabe 0 oder 30 zu. Da jetzt mit 59 anzufangen, ist nicht sinnvoll. Dann kann man auch gleich auf die nächste volle Minute gehen. Die eine Sekunde macht den Helmut auch nicht fett.

      DerSmurf schrieb:

      ein kommplett neues DataSet würde sich ja dann jetzt hier geradezu aufdrängen.
      Nee. Das macht alles nur komplizierter. Versuch mal mit EdRs Helpers 2 tDSs gleichzeitig an ein anderes Form zu übergeben.
      Das kommt einfach in eine neue DataTable Deines bestehenden tDSs: eine neue DataTable namens "Abkühlzeiten"* mit ID [Int32], Temperatur [Int32] und Abkühlzeit [Int32? TimeSpan?]. Die kannst Du dann zu Programmstart ggf. mit Defaultwerten bestücken.

      Das mit mehreren Gefäßen bzgl.

      DerSmurf schrieb:

      Aber dann muss ich ja dem Gefäß "Tasse 200ml" mehrere Werte zuweisen. "Temp95" mit Abkühlzeit, "Temp90" mit Abkühlzeit usw.
      da hat aber sich jemand EdRs Videos nicht ganz so genau abgeschaut ;) . Da kommt dann einfach eine weitere Tabelle ins tDS namens Gefäß mit ID [Int32] und Name [String], ggf. noch Volumen [z.B. Int32], dann in die Abkühlzeit-Tabelle noch als Zusatzspalte GefäßID [Int32] und dann werden die miteinander verknüpft, sodass ein Gefäß mehrere Abkühlzeiten haben kann.

      * ich verwende keine deutschen Bezeichner, nicht nur wegen dem sich ergebenden Denglisch-Syntax im Code, sondern auch wegen Umlauten. Aber für Deine Zwecke geht das schon.
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
      ABzgl. der Abkühlzeiten mehrerer Gefäße. Mist! Ich hab mir die Videos mehrere Male angesehen.
      Aber mir fällt jetzt erst ein, dass da doch wars war :o)
      Also kenne ich mein Fernsehprogramm fürs Wochenende :o)

      Die Zeiten können Variable hochgestellt werden (in den Einstelungen änderbar) - ich habe es nur per Defaut auf 30 Sek.
      Weil es ja änderbar ist, habe ich die 59 als max gewhält, damit auch eine Erhöhung in kleinen Schritten sinnvoll bleibt.
      Also sinnvoll im Sinne des Programmes (Ich kenne keinen Tee, auf dem nicht eine Ziehzeit in vollen Minuten angegeben ist).

      Eins noch zum letzten Post. Variable = Variable + 1 ersetzen in Variable += 1.
      Das werde ich versuchen umzusetzen, aber ich vergesse es beim Coden immer wieder.
      Auch an die Wahrheitsprüfung werde ich in Zukunft denken.

      Dann mache ich mich heute Abend mal daran, ein zweites Datatable, mit den Abkühlzeiten (erstmal ohne verschiedene Gefäße) einzubauen.
      Hier binde ich dann die Labels Temperatur und AbkühlzeitMinuten und -Sekunden dran.
      Ich möchte allerdings, dass die Temperatur weiterhin über die Plus und Minus Buttons steuerbar ist.
      Hier würde ich eine Klassenvariable als "Zähler" anlegen und diesen mit Klick auf Plus und Minus erhöhen, oder verkleinern.
      Der Zähler steuert dann (wie die Schleife im Tutorial von EdR) die Einträge im Dataset.
      Oder geht das einfacher? Notafalls auch mit einem anderen Control als dem Label?

      DerSmurf schrieb:

      Ich möchte allerdings, dass die Temperatur weiterhin über die Plus und Minus Buttons steuerbar ist.
      Hier würde ich eine Klassenvariable als "Zähler" anlegen und diesen mit Klick auf Plus und Minus erhöhen, oder verkleinern.
      Der Zähler steuert dann (wie die Schleife im Tutorial von EdR) die Einträge im Dataset.
      Oder geht das einfacher? Notafalls auch mit einem anderen Control als dem Label?

      Ich habe gerade gar keine Ahnung, was Dir hier vorschwebt. Ich hätte einfach bei [+] und [-] den DataTable-Wert, der ja dann auch über ein BindingSource.Current erreichbar wäre, entsprechend verändert. Und dadurch verändert sich ja auch dann der Labelanzeigewert. Keine weitere Klassenvariable, kein anderes Control, einfach direkter Zugriff.
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
      Huhu
      Ich wurschtel jetzt gestern und heute abend daran rum, aber ich bekomme es einfach nicht hin.

      Ich versuche die Temperaturzeiten mit verschiedenen Gefäßen umzusetzen.
      Dazu habe ich die beiden Datatables erstellt und entsprechend verknüpft.
      Dann habe ich in der Einstellungenform erstmal zwei Datagridviews erstellt, eine für die Gefäße, eine für die Abkühlzeiten.
      Das funktioniert auch soweit. Ich kann neue Gefäße hinzufüge und für jedes dann einzelne Temperaturen erstellen.
      Jedoch bekomme ich die Daten nicht in meine Datei Tee.xml gespeichert. Liegt das daran, dass ich die Datei ja quasi zweimal öffne? Einmal in der Hauptform und einmal in der Einstellungen form?

      Quellcode

      1. Imports Tea_Timer_Professional.DataSet1
      2. Public Class frmEinstellungen
      3. Private _DataFile As New FileInfo("Tee.Xml")
      4. 'Form Load und Close Event
      5. Private Sub FrmEinstellungen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      6. DataSet1.ReadXml(_DataFile.FullName)
      7. End Sub
      8. Private Sub frmEinstellungen_Closed(sender As Object, e As EventArgs) Handles Me.Closed
      9. DataSet1.WriteXml(_DataFile.FullName)
      10. End Sub

      Hier passiert nach dem schließen der Form einfach nichts. Die xml Datei wird nicht verändert.
      Also habe ich eine neue erstellt:

      Quellcode

      1. Private _DataFile As New FileInfo("Abkuehlzeiten.Xml")


      Nun wird alles schön gespeichert. Und ist nach einem neustart des Programmes auch wieder da.
      Allerdings bekomme ich das ganze jetzt nicht in meine Hauptform eingebunden.
      Dort lade ich die Abkuehlzeiten.xml und habe wie im Tutorial vom EdR erklärt eine Combobox erstellt, dir mir den Namen der Gefäße anzeigen soll.

      Wenn ich nun aber in der Hauptform dem Datatable zwei xml Dateien zuweise, kackt mein Programm ab.
      Ich denke das liegt daran, dass ja keiner weiß welche Daten in welcher xml gespeichert sind. Also muss alles in eine Datei.
      Aber daran verzweifel ich. Habs noch mal hochgeladen, denn dazu finde ich im Tutorial leider nix :(

      Könntest du mal bitte das DataSet überprüfen und mir erklären, wie ich die Daten speichern soll?
      Dateien
      • Tea Timer.zip

        (1,95 MB, 3 mal heruntergeladen, zuletzt: )

      DerSmurf schrieb:

      Jedoch bekomme ich die Daten nicht in meine Datei Tee.xml gespeichert. Liegt das daran, dass ich die Datei ja quasi zweimal öffne?
      Wat? Neeneenee. Ich will nicht schon wieder auf die Videos und so hinweisen, daher anders: Du lädst Deine tDS-Datendatei nur 1x: Im Hauptform. Dann gibst Du die (nun befüllte) tDS-Instanz an die Subforms weiter, wo sie ggf. bearbeitet werden. Und wenn dort Änderungen vorgenommen wurden, kommen die im Hauptform auch an - weil Du ein und dasselbe tDS bearbeitest. Keine 2. XML laden, kein paralleles tDS in nem Subform befüllen. Alle Daten werden in einer einzigen XML-Datei abgespeichert.

      ##########

      @DerSmurf: Hier noch Nachschlag/Dessert:
      So. Durchgeschaut.

      VB.NET-Quellcode

      1. Dim frmEinstellungen As New frmEinstellungen
      2. frmEinstellungen.Show(Me)

      Nee. Musst das tDS übergeben, sonst haste ne eigene tDS-Instanz im Subform, nicht die vom Hauptform. Keine Ahnung, wie das mit den Helpers von @ErfinderDesRades geht. Ich hab da eigene Methoden. Die Lade- und Speicherzeilen im Subform müssen auch weg. Die Daten mit Gefäß und Abkühlzeiten sind ja schon in der Tee.xml drinne.
      Im Subform darf's keine Gefäß-ID-Spalte geben. Woher soll der User denn wissen, welches Gefäß welche ID hat. Da gäbe es 2 Alternativen: DGV1 mit nur-Gefäßen und DGV2 mit gefäßabhängigen Abkühlzeiten (Parent-Child-View?) oder eben ne ComboBox-Spalte mit Datenquelle Gefäße (keine Ahnung, Joining-View?)
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

      Naja, immerhin hatte ich die richtige Vermutung, warum es nicht läuft.
      Ich werde jetzt erstmal nochmal das Forum und die Videos bemühen, bevor ich dir weiter auf den Sack gehe.
      Denn ich an deiner Stelle wäre glaube ich jetzt mit mir als "Schüler" ausgerastet.

      edit: uff den code aus der frmeinstellungen raus und wie folgt aufrufen.

      Quellcode

      1. Private Sub EinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EinstellungenToolStripMenuItem.Click
      2. Dim frmEinstellungen As New frmEinstellungen
      3. frmEinstellungen.GefaessBindingSource.DataSource = Me.DataSet1
      4. frmEinstellungen.Show(Me)
      5. End Sub

      so gehts :)

      edit2:
      Klar die IDs müssen raus - soviel habe ich immerhin behalten vom video gucken :)
      aber mir gings erstmal nur darum daten in die Datatables zu bekommen, damit ich den Code im Hauptprogramm ändern kann.
      Hübsch mach ichs hinterher, wenn ichs am laufen hab.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DerSmurf“ ()

      holla, nun habe ich es hinbekommen und versuche mich an der Umsetzung der Plus und Minus Buttons.
      Allerdings finde ich keine Möglichkeit die ausgewählte Zeile im Dataset auszulesen.
      Folgender Post erklärt zwar wie ich eine Position setzte:
      Daten laden, speichern, verarbeiten - einfachste Variante
      aber ich schaffe es nicht die aktuelle Position auszulesen :(
      Hier müsste ich ja dann nur +1, bzw. -1 als neue Position angeben.
      Aber

      Quellcode

      1. ​Dim Zeile = DirectCast(DirectCast(AbkuehlzeitenBindingSource.Current, DataRowView).Row, AbkuehlzeitenRow)
      hat keine Eigenschaft zum auslesen der aktuellen Zeilennummer. Oder habe ich diese übersehen?
      Ach dafür sind [+] und [-] da ...
      Ich dachte, dass es darum geht, Temperatur oder Ziehzeit zu verändern. Ach, stop. Du bist bei frmEinstellungen. Öhm ... was für +/- Buttons?
      Na wurscht.
      Du willst die aktuelle Zeilennummer auslesen oder verändern? Da kann Dir die aktuell gewählte DataRow nicht helfen. Es geht viel einfacher. Denn wer kennt die ggf. aus der DataTable gefilterte oder sortierte Liste? Die BindingSource. Daher ist sie die richtige Ansprechpartnerin. Schau mal rein, was Deine AbkuehlzeitenBindingSource so für Funktionen und Properties hat. Die hier z.B.:
      [+] = AbkuehlzeitenBindingSource.MoveNext
      [-] = AbkuehlzeitenBindingSource.MovePrevious
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
      Ah. Deswegen finde ich nix.
      Gut, dann wende ich mich an die BindingSource - eigentlich ja auch logisch irgendwie...

      Plus und Minusbuttons neben der Temperatur sind dazu da, diese in 5° Schritten zu verändern (aber das werde ich wohl auf 10° Schritte ändern).
      Aus der geänderten Temperatur wird dann (bisher) die TemperaturinZeit() Sub ausgeführt, die dann die zur Temperatur hinterlegte Abkühlzeit in die Labels schmeißt.

      Dann wäre aber mit den Properties der BindingSource der Code für Plus und Minus Button recht schnell fertig.

      Problem ist ja dann noch. Wenn ich eine TeeSorte auswähle, ändert sich ja auch die Abkühlzeit.
      Hier muss ich dann aber wahrscheinlich die gespeicherte Temperatur des Tees in meiner AbkuehlzeitenBindingSource suchen und die Active Row entsprechend setzen? Also schleife durch Abkuehlzeiten, wenn Temperatur gefunden, entsprechende Zeile anzeigen.
      Oder geht auch das einfacher?
      Auf welchem Form bist Du jetzt gedanklich? Hauptform? Ich blick's auch insofern nicht, weil ja Tee und Abkühlzeiten im Datenmodell noch unabhängig voneinander sind. Hast Du das Datenmodell geändert? Falls ja: zeig mal per tDS-Screenshot. Falls nein, dann ist Deine Vermutung richtig. Geht mit ForEach, geht aber auch mit LINQ:

      VB.NET-Quellcode

      1. Dim AktuelleTeesorte = '... Dein DoppelCast aus der DTTeesortenBindingSource
      2. Dim AktuellesGefaess = '... Dein DoppelCast aus der GefaessBindingSource
      3. Dim AktuelleAbkuehlzeit = AktuellesGefaess.GetAbkuehlzeitenRows().FirstOrDefault(Function(x) x.Temperatur = AktuelleTeesorte.Temperatur)
      4. If AktuelleAbkuehlzeit Is Nothing Then MessageBox.Show($"Uh oh, die Abkühlzeit für die Temperatur {AktuelleTeesorte.Temperatur} gibt's für das Gefäß {AktuellesGefaess.Name} gar nicht :-("): Exit Sub
      5. 'und was immer Du jetzt mit der Abkühlzeit machen willst, kommt hierher, z.B.:
      6. DeinAnzeigenlabel.Text = AktuelleAbkuehlzeit.ZeitMin.ToString()
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
      Huhu.
      Ja ich bin auf der Hauptform.
      Screenshot vom tDs kann ich leider nicht machen, habe ich zuhause auf meinem anderen Laptop.
      Habe meinen alten 17 Zöller mal wiederbelebt. Das ist Abends auf der Couch irgendwie angenehmer als heir mit meinem (dafür) viel zu kleinen Surface.

      Das tDs sieht wie folgt aus (schaff ich auch aus dem Kopf)
      TeeSorten:
      - ID
      - Name
      - Temperatur
      - Abkühlzeit Min
      - Abkühlzeit Sek

      Gefaess:
      -ID (verknüpft mit Tabelle Abkuehlzeiten Spalte Gefaess ID)
      - Name

      Abkuehlzeit:
      - ID
      - Temperatur
      - Abkuelhzeit Min
      - Abkuehlzeit Sek
      - Gefaess ID (verknüpft mit Tabelle Gefaess Spalte ID)
      Ich hab's ja im aktellen Projekt gesehen, daher war es nicht notwendig. Ich dachte nur, dass Du ggf. was seitdem geändert hättest. Aber ich hab ja auch schon was gepostet, was eben unter Beibehaltung des Modells gemacht werden muss.
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
      Guten Abend mein lieber.
      Ich habs geschafft :)
      Aber ich möchte ja mit meiner gefundenen Abkühlzeit nüscht machen, sondern die entsprechende Zeile in der AbkuehlzeitBindingSource selektieren, damit in meinen Labels die Werte aus dem DataTable angezeigt werden.

      Quellcode

      1. Private Sub DTTeesortenDataGridView_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DTTeesortenDataGridView.CellContentClick
      2. Dim aktuelleTeesorte = DirectCast(DirectCast(DTTeesortenBindingSource.Current, DataRowView).Row, DTTeesortenRow)
      3. Dim aktuellesGefaess = DirectCast(DirectCast(GefaessBindingSource.Current, DataRowView).Row, GefaessRow)
      4. Dim AktuelleAbkuehlzeit = aktuellesGefaess.GetAbkuehlzeitenRows().FirstOrDefault(Function(x) x.Temperatur = aktuelleTeesorte.Temperatur)
      5. If AktuelleAbkuehlzeit Is Nothing Then
      6. MessageBox.Show($"Uh oh, die Abkühlzeit für die Temperatur {aktuelleTeesorte.Temperatur} gibt's für das Gefäß {aktuellesGefaess.Name} gar nicht :-(")
      7. Exit Sub
      8. End If
      9. For i = 0 To Me.AbkuehlzeitenBindingSource.Count - 1
      10. Dim Abkuehlzeiten = DirectCast(DirectCast(AbkuehlzeitenBindingSource(i), DataRowView).Row, AbkuehlzeitenRow)
      11. If AktuelleAbkuehlzeit.Temperatur.ToString Like Abkuehlzeiten.Temperatur.ToString Then
      12. AbkuehlzeitenBindingSource.Position = i
      13. End If
      14. Next
      15. End Sub


      Nun muss ich nur noch ein Event beim ändern des Gefäßes erstellen.
      Wenn ich nämlich das Gefäß mittels Combobox umstelle, springt die Binding Source auf den ersten Wert - es wird also 100° angezeigt.
      Das soll aber natürlich nicht passieren, wenn eine Teesorte (mit anderer Temperatur als 100°) ausgewählt ist.
      Die Temperatur soll "stehen bleiben" und sich nur die Abkühlzeit ändern.

      edit:
      grml.
      Es ist egal welches ChangeEvent der Combobox ich nutze. Scheinbar wird der Eintrag in meiner GefaessbindingSource erst nach dem beenden des Change Events geändert.

      Quellcode

      1. ​ Dim aktuellesGefaess = DirectCast(DirectCast(GefaessBindingSource.Current, DataRowView).Row, GefaessRow)
      2. MessageBox.Show(aktuellesGefaess.Name.ToString)

      gibt mir immer (wie gesagt, egal in welchem Ereignis) den Namen des Gefäßes welches VOR der Änderung der Combobox selektiert war.
      Ich muss ja aber das neu ausgewählte Gefäß casten, damit ich oben gepostete Sub entsprechend laufen lassen kann.

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

      Ich komm insofern nicht mehr hinterher, weil Du schon einige Programmpunkte geändert hast. Du bist wieder auf dem Hauptform. Und hast jetzt noch eine Gefäßauswahl eingebaut, richtig?
      Ok, wenn es Dir nur um die richtige Abkühlzeitauswahl geht, ja, dann würde ich es wohl auch so machen mit der For-Loop über die BS-Listenelemente.
      Allerdings: Was soll die Zeile:

      VB.NET-Quellcode

      1. If AktuelleAbkuehlzeit.Temperatur.ToString Like Abkuehlzeiten.Temperatur.ToString Then
      ?
      spricht was gegen

      VB.NET-Quellcode

      1. If AktuelleAbkuehlzeit.Temperatur = Abkuehlzeiten.Temperatur Then
      ?

      DerSmurf schrieb:

      es wird also 100° angezeigt.
      Das soll aber natürlich nicht passieren
      Ggf. solltest Du Dir dann eine Änderung des CE-DataBindings überlegen. Wenn nur bedingt Änderungen vorgenommen werden sollen, dann entferne es und programmiere das, was Du willst.

      DerSmurf schrieb:

      Scheinbar wird der Eintrag in meiner GefaessbindingSource erst nach dem beenden des Change Events geändert.
      Was'n für'n Change-Event? Damit meinst Du wohl nicht das GefaessBindingSource.CurrentChanged-Event, denn das wird gefeuert, wenn die Änderung abgeschlossen ist, also sich die BS-Position geändert hat.

      btw: bitte die richtigen CodeTags verwenden
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
      Huhu.
      Ah sorry. Das hätte ich erwähnen sollen.
      Ja, ich habe eine Gefäßauswahl als Combobox hinzugefügt.
      Auf der Hauptform läuft alles, wenn ich einen Tee aus dem datagridview auswähle, wird die Temperatur angezeigt und entsprechend die Abkühlzeit. Hierbei werden jetzt nirgendwo mehr Daten aus irgendwelchen Controls gezogen.
      Auch die Temperatur + und - Buttons machen was sie sollen.

      Das Problem ist nun:
      Auswahl eines Tees aus dem Gridview mit Temperatur 90°
      es wird die korrekte Abkühlzeit für den ausgewöhlten Becher angezeigt.
      Ändere ich aber den Becher mittels Combobox, springt die Temperatur auf 100°, weil scheinbar der erste Eintrag der entsprechenden Binding Source geladen wird.
      Ich wollte also im ChangeEvent der Combobox prüfen ob der Index meiner DTTeesortenBindingSource <> -1 ist und entsprechend die aktuell ausgewählte Temperatur laden.

      edit: irgendwie habe ich das Gefühl, dass es nicht so sinnvoll war, die Gefäße als DataSet zu speichern. Wäre es nicht eleganter eine Gefäßklasse zu erzeugen?
      Also mit Eigenschaften wie Abkuehlzeitbis90Grad, bis80Grad, bis70Grad, bis60Grad und aktuelleAbkuehlzeit und einer Methode, der die Temperatur übergeben wird, und die dann die entsprechende Abkühlzeit zurückgibt.
      Irgendwie wäre das doch sinnvoller, als das was ich hier gerade tue, oder?

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DerSmurf“ ()

      DerSmurf schrieb:

      springt die Temperatur auf 100°, weil
      da wohl ein DataBinding ist, was ggf. nicht sinnvoll ist - wie erwähnt.

      DerSmurf schrieb:

      dass es nicht so sinnvoll war, die Gefäße als DataSet zu speichern. Wäre es nicht eleganter eine Gefäßklasse zu erzeugen?
      Du hast ne Gefäßklasse. In Deinem DataSet. Es ist zwar in Form einer DataTable und richtig OOP ist damit auch nicht möglich, aber das, was Du brauchst, hast Du bereits. Du könntest genauso in Deiner GefäßDT eine Spalte mit AktuelleTemperatur machen.

      DerSmurf schrieb:

      Also mit Eigenschaften wie Abkuehlzeitbis90Grad, bis80Grad, bis70Grad, bis60Grad
      Ist das, was Du nicht machen solltest. Die 2 DataTables sind (m.E.) der richtige Weg.

      DerSmurf schrieb:

      eine[...] Methode, der die Temperatur übergeben wird, und die dann die entsprechende Abkühlzeit zurückgibt
      hast Du bereits und kannst sie so umschreiben, dass das auch mit Deiner GefäßDT geht. Ich versteh wohl gerade nicht, wo Du nicht weiterkommst.
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
      Huhu
      Ok, dann denke ich nicht weiter über eine Gefäßklassse nach.
      Mein Problem ist wie gesagt, dass die Labels Temepratur (welche an die Abkühlzeit gebunden sind), immer 100° anzeigen, wenn ich erst einen Tee auswähle und dann im Anschluss das Gefäß ändere.
      Mache ich dies, muss ich in meinem Dgv den Tee erneut auswählen.
      Die Methode für Temperatur - Abkühlzeit habe ich zwar, ich vermute du meinst diese hier?
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Private Sub DTTeesortenDataGridView_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DTTeesortenDataGridView.CellContentClick
      2. Dim aktuelleTeesorte = DirectCast(DirectCast(DTTeesortenBindingSource.Current, DataRowView).Row, DTTeesortenRow)
      3. Dim aktuellesGefaess = DirectCast(DirectCast(GefaessBindingSource.Current, DataRowView).Row, GefaessRow)
      4. Dim AktuelleAbkuehlzeit = aktuellesGefaess.GetAbkuehlzeitenRows().FirstOrDefault(Function(x) x.Temperatur = aktuelleTeesorte.Temperatur)
      5. If AktuelleAbkuehlzeit Is Nothing Then
      6. MessageBox.Show($"Uh oh, die Abkühlzeit für die Temperatur {aktuelleTeesorte.Temperatur} gibt's für das Gefäß {aktuellesGefaess.Name} gar nicht :-(")
      7. Exit Sub
      8. End If
      9. For i = 0 To Me.AbkuehlzeitenBindingSource.Count - 1
      10. Dim Abkuehlzeiten = DirectCast(DirectCast(AbkuehlzeitenBindingSource(i), DataRowView).Row, AbkuehlzeitenRow)
      11. If AktuelleAbkuehlzeit.Temperatur.ToString Like Abkuehlzeiten.Temperatur.ToString Then
      12. AbkuehlzeitenBindingSource.Position = i
      13. End If
      14. Next
      15. End Sub

      Jedoch bekomme ich diese nicht ins Change Event meiner Gefäßauswahl Combobox eingebaut.
      Denn der Index meiner Gefäßbindingsource wird erst aktualisiert, nachdem die Events (egal welches ich nehme) der Combobox fertig sind.

      Aber vielleicht sollte ich einfach die Temperaturen in meiner DataSource verknüpfen.
      Es müsste doch alles von selbst funktionieren, wenn ich die Temperaturspalte des Tees, mit der Temperaturspalte der Abkühlzeit verknüpfe.
      So wie beim EdR mit den Lieferanten.. Ich spiele heute Abend mal mit meinem DataSet und schreie nochmal, wenn ichs nicht hinbekomme.

      DerSmurf schrieb:

      Mein Problem ist wie gesagt, dass die Labels Temepratur (welche an die Abkühlzeit gebunden sind), immer 100° anzeigen, wenn ich erst einen Tee auswähle und dann im Anschluss das Gefäß ändere.
      Das Temperaturlabel ist an eine Abkühlzeit gebunden, ok. Da die Abkühlzeit aber an ein Gefäß gebunden ist, ändert das Gefäß ja auch die Abkühlzeit und damit die Labelbeschriftung. Wie gesagt: Binding zum Label rausnehmen. Oder aktuelle Solution mal hochladen.
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.