Neuerstellen eines umfangreichen Projektes - aus schlechtem Code mach guten Code

  • VB.NET

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

    VaporiZed schrieb:

    Dann wird das Event eben zu Programmbeginn 5x gefeuert. Macht doch nix.

    Ich dachte das zählt als unsauber, wenn es sich vermeiden ließe. Wenns das sinnlose Feuern des Events nicht stört - störts mich auch nicht.

    VaporiZed schrieb:

    Versuche immer so positiv wie möglich zu formulieren, um doppelte Verneinungen zu vermeiden

    Damit habe ich Probleme:

    VB.NET-Quellcode

    1. Private Function CheckIfUserInputIsCorrect() As (UserInputCorrect As Boolean, ErrorText As String)
    2. If TBKundenname.Text.IsEmpty Then Return (False, "kein Kundenname angegeben.")
    3. '...
    4. Return (True, "")
    5. End Function

    Denn ich muss ja auf IsEmpty prüfen. Damit ich die Funktion verlasse, wenn IsEmpty True ist (weitere Prüfungen sind ja dann überflüssig).
    In diesem Fall brauche ich ja aber den Errortext. Wie stelle ich das positiv um, ohne die gesamte Funktion massiv verändern zu müssen?

    Dass die Weitergabe der Position nicht so ideal ist, habe ich mir schon gedacht (auch wenn ich das in meiner bisherigen Anwendung öfters praktiziere - fällt dann in die Kategorie Glück gehabt :o)
    Ich habe nun versucht das ganze mit dem BS.Current und deinem CodeSnippet zu lösen, scheitere aber dran.
    Also mittels Event übergebe ich das BSCurrent as Object an die frmHaupt.
    Dort passiert dann folgendes:

    VB.NET-Quellcode

    1. Private Sub ShowCustomerOrderPage(BSCurrent As Object)
    2. If BSCurrent Is Nothing Then
    3. UcKundenbestellung._BSFilteredBySupplierIsActivated = False
    4. Else
    5. UcKundenbestellung.CCBLieferant.UndoClear()
    6. UcKundenbestellung.SetSupplierToShow(BSCurrent)
    7. End If
    8. TCHaupt.SelectedTab = TPKundenbestellungen
    9. End Sub
    10. 'Klasse UCKundenbestellung:
    11. Public Sub SetSupplierToShow(BSCurrent As Object)
    12. For i = 0 To BSLieferant.Count - 1
    13. If BSLieferant.Item(i).Equals(BSCurrent) Then
    14. BSLieferant.Position = i
    15. _BSFilteredBySupplierIsActivated = True
    16. SetBindingSource()
    17. Exit For
    18. End If
    19. Next
    20. End Sub

    Zunächst, ich brauche ja die BS der UCKundenbestellung. Daher der Code auf der UCKundenbestellung (müsste doch richtig sein?)
    Und zur Public Sub: Ich denke das lässt sich besser lösen, wenn die frmHaupt ein Event feuert, welches die UCKundenbestellung dann empfängt.
    (Also ich weiß, dass diese Sub nicht gut ist - ein Fortschritt :o) - und werde sie beseitigen). Aber zum testen wars mir angenehmer (damit nicht evtl. mein falsches Event Schuld am nicht funktionierenden Code ist - bin da ja noch nicht ganz fit.).
    Aber die Vergleichszeile im Code: If BSLieferant.Item(i).Equals(BSCurrent) Then ist immer False.
    Auch wenn es im Überwachsungsfenster so aussieht, als habe sich ein PerfectMatch gefunden:(

    Edit: alle anderen Verbesserungen / Fehler / etc. habe ich verstanden und/oder stillschweigend umgesetzt/behoben.

    Edit2: Einen Upload gibts natürlich auch noch.

    und das letzte Edit: (ich mache den PC nun vorerst aus.
    Ich habe mir den Code vom @ErfinderDesRades rausgesuch. Hier wird der korrekte Lieferant gefunden:

    VB.NET-Quellcode

    1. Public Sub SetSupplierToShow(BSCurrent As Object)
    2. 'For i = 0 To BSLieferant.Count - 1
    3. ' If BSLieferant.Item(i).Equals(BSCurrent) Then
    4. ' BSLieferant.Position = i
    5. ' _BSFilteredBySupplierIsActivated = True
    6. ' SetBindingSource()
    7. ' Exit For
    8. ' End If
    9. 'Next
    10. Dim SelectedSupplier = DirectCast(DirectCast(BSCurrent, DataRowView).Row, DtsDaten.LieferantRow)
    11. BSLieferant.Position = FindX(BSLieferant, SelectedSupplier)
    12. _BSFilteredBySupplierIsActivated = True
    13. End Sub
    14. Public Function FindX(bs As BindingSource, rwSearch As DataRow) As Integer
    15. For i As Integer = 0 To bs.Count - 1
    16. If DirectCast(bs(i), DataRowView).Row Is rwSearch Then Return i
    17. Next
    18. Return -1
    19. End Function

    (Die Konvertierung in die dtsDaten.LieferantRow könnte ich ja bereits am Anfang durchführen, und dann diese Row durchschleifen, anstelle des Objects.)
    Hiermit wird nun der korrekte Lieferant gefunden - aber der falsche angezeigt.
    Ich aktualiasiere meinen Upload, sodass er folgenden Code enthält:

    VB.NET-Quellcode

    1. Public Sub SetSupplierToShow(BSCurrent As Object)
    2. 'For i = 0 To BSLieferant.Count - 1
    3. ' If BSLieferant.Item(i).Equals(BSCurrent) Then
    4. ' BSLieferant.Position = i
    5. ' _BSFilteredBySupplierIsActivated = True
    6. ' SetBindingSource()
    7. ' Exit For
    8. ' End If
    9. 'Next
    10. Dim SelectedSupplier = DirectCast(DirectCast(BSCurrent, DataRowView).Row, DtsDaten.LieferantRow)
    11. BSLieferant.Position = FindX(BSLieferant, SelectedSupplier)
    12. _BSFilteredBySupplierIsActivated = True
    13. End Sub
    14. Public Function FindX(bs As BindingSource, rwSearch As DataRow) As Integer
    15. For i As Integer = 0 To bs.Count - 1
    16. If DirectCast(bs(i), DataRowView).Row Is rwSearch Then Return i
    17. Next
    18. Return -1
    19. End Function

    Nun wird in der FindX Funktion an der richtigen Stelle da i zurückgegeben. Aber immernoch der falsche Lieferant in der CCB (und damit auch im DGV) angezeigt.
    Testbar durch anzeige der LIeferungen von LIeferant No1 (Klick auf "€" Button und LIeferanten auswählen). Dann speichern (ohne Änderungen machen zu müssen) und den Dialog mit Ja abschließen.
    Nun werden Kundenbestellungen des Lieferanten No2 angezeigt.

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

    DerSmurf schrieb:

    Denn ich muss ja auf IsEmpty prüfen. Damit ich die Funktion verlasse, wenn IsEmpty True ist (weitere Prüfungen sind ja dann überflüssig). In diesem Fall brauche ich ja aber den Errortext. Wie stelle ich das positiv um, ohne die gesamte Funktion massiv verändern zu müssen?
    Ich versteh grad das Problem nicht. Die Funktion arbeitet doch so, wie es soll. Ehh, Moment. Irgendwas ist verwirrend. In Post#96 nenne ich noch als Tupel-Teilrückgabeparameter FalseData. Aber im Post davor hattest Du das Projekt gepostet und da ist es schon geändert in UserInputCorrect. ?(

    Bzgl. BS.Current: 2 DataRowViews sind offensichtlich für dieselbe Row doch zwei unterschiedliche Objekte. Von daher:

    VB.NET-Quellcode

    1. Public Sub SetSupplierToShow(BSCurrent As Object)
    2. For i = 0 To BSLieferant.Count - 1
    3. If DirectCast(BSLieferant.Item(i), Data.DataRowView).Row.Equals(DirectCast(BSCurrent, Data.DataRowView).Row) Then
    4. BSLieferant.Position = i
    5. _BSFilteredBySupplierIsActivated = True
    6. SetBindingSource()
    7. Exit For
    8. End If
    9. Next
    10. 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.

    VaporiZed schrieb:

    Ich versteh grad das Problem nicht. Die Funktion arbeitet doch so, wie es soll. Ehh, Moment. Irgendwas ist verwirrend. In Post#96 nenne ich noch als Tupel-Teilrückgabeparameter FalseData. Aber im Post davor hattest Du das Projekt gepostet und da ist es schon geändert in UserInputCorrect.

    Jupp, ich bin doof. Du redest von der UCLieferung (wo ich ja drum gebeten habe). Hier habe ich es mit If UserInput.FalseData Then falsch gemacht.
    Im früheren Code - im dlgKundenbestellungBearbeiten - habe ich es richtig gemacht. Warum auch immer habe ich nun dort geschaut und von dort gepostet.
    Also Problem erkannt.

    Zur Übergabe des Lieferanten. Der Code (deiner aus Post 102) Funktioniert (er findet den korrekten Lieferanten), aber wenn du das ganze mit Lieferant No1 durchspielst, werden die Bestellungen des Lieferanten No2 angezeigt.
    Ich denke ich habe da noch etwas mit deinem Control verrafft:
    "Testbar durch anzeige der LIeferungen von LIeferant No1 (Klick auf "€" Button und LIeferanten auswählen). Dann speichern (ohne Änderungen machen zu müssen) und den Dialog mit Ja abschließen.Nun werden Kundenbestellungen des Lieferanten No2 angezeigt.

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

    Ich kenn mich in Deinem Programm leider nicht aus. Ich starte das Programm und klicke was genau, um den Fehler zu Gesicht zu bekommen? Einen €-Button hab ich nicht gefunden.
    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.
    Hmm. Hier hängt erstmal die aktuellste Version dran.
    1. im MenuStrip auf den Euro Button klicken
    2. im Dialog den Lieferanten No1 auswählen
    3. den speichern Butten (Diskettenbild) anklicken
    4. im Dialog auf Ja
    5. es werden Kundenbestellungen von Lieferant No2 angezeigt :(
    Dateien
    • Theo.zip

      (956,25 kB, 24 mal heruntergeladen, zuletzt: )
    @VaporiZed: Ich hätte mal eine zwischenfrage:

    Private Function CheckIfUserInputIsCorrect() As (UserInputCorrect As Boolean, ErrorText As String) kann man das durchaus so machen
    und ist das gängige Praxis? Ich kenne Funktionen nur mit einem Rückgabewert, hätte mir aber an ein paar Stellen in meinem Projekt gewünscht,
    dass auch mehrere gehen - wusste garnicht, dass sowas möglich ist ?(
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Wenn man mehrere Rückgabewerte braucht, ist das eine Möglichkeit. Alternativ kann man auch eine pure Datenklasse erstellen und die Funktion gibt eine befüllte Instanz jener Klasse wieder, die dann die aufrufende Methode analysiert. Wie man will. Solange man keine ByRef-Parameter als Rückgabewerte missbraucht, ist alles gut.

    Also falsch:

    VB.NET-Quellcode

    1. Private Sub GibMirInfos(ByRef Rückgabewert1 As Integer, ByRef Rückgabewert2 As String)
    2. Rückgabewert1 = 42
    3. Rückgabewert2 = "die Antwort auf alles"
    4. End Sub

    auch falsch

    VB.NET-Quellcode

    1. Private Function GibMirInfos(ByRef Rückgabewert1 As Integer, ByRef Rückgabewert2 As String) As Boolean
    2. Rückgabewert1 = 42
    3. Rückgabewert2 = "die Antwort auf alles"
    4. Return True
    5. End Function


    1. richtige Variante:

    VB.NET-Quellcode

    1. Private Function GibMirInfos() As (Rückgabewert1 As Integer, Rückgabewert2 As String)
    2. Return (42, "die Antwort auf alles")
    3. End Function


    2. richtige Variante:

    VB.NET-Quellcode

    1. Class Informationspaket
    2. Property DieAntwort As Integer
    3. Property DieAntwortAlsErklärung As String
    4. End Class
    5. Private Function GibMirInfos() As Informationspaket
    6. Return New Informationspaket With {.DieAntwort = 42, .DieAntwortAlsErklärung = "die Antwort auf alles"}
    7. End Function


    3. richtige Variante wäre mit der Tuple-Class, aber die muss eigentlich nicht mehr sein.

    ##########

    @DerSmurf: Die BS-Position wird richtig gesetzt, allerdings wird die CCB aktiviert. Leider fehlt mir die Zeit gerade, um nach der aktivierenden Codestelle zu suchen. Hab nur einen Minifehler gesehen:

    VB.NET-Quellcode

    1. Private Sub MSEintrag_Click(sender As Object, e As EventArgs) Handles MSStart.Click, MSAdressen.Click, MSEinstellungen.Click,
    2. MSKundenbestellungen.Click, MSSonderpreise.Click, MSLieferung.Click
    3. Select Case True
    4. Case sender Is MSStart : ShowStartPage()
    5. Case sender Is MSAdressen : ShowAddressPage()
    6. Case sender Is MSEinstellungen : ShowSettingsPage()
    7. Case sender Is MSKundenbestellungen : ShowCustomerOrderPage(Nothing) '<-- hier stand vorher 0, was dann zum Crash führt
    8. Case sender Is MSSonderpreise : ShowSpecialPricesPage()
    9. Case sender Is MSLieferung : SelectSupplierAndShowDeliveryPage()
    10. End Select
    11. 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.

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

    Danke für die Rückmeldung. ByVal und ByRef verwende ich nie - wüsste auch nicht, warum. Mir war nur nicht klar, dass eine Funktion mehr als einen Wert zurückgeben kann.
    Aber das kann sie und darf man so machen - also werde ich das wohl auch mal verwenden ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Alles gut. Ich kann warten. Habe jetzt noch ein bisschen (erfolglos) rumprobiert.
    Wenn ich den RestoreData Aufruf in der UndoClear Sub auskommentiere, werden mir die richtigen Bestellungen angezeigt, aber die CCS zeigt alle.
    Vielleicht hilft dir das ja irgendwie.

    Und wenn ich das hier:
    1. im MenuStrip auf den Euro Button klicken 2. im Dialog den Lieferanten No1 auswählen 3. den speichern Butten (Diskettenbild) anklicken 4. im Dialog auf Ja 5. es werden Kundenbestellungen von Lieferant No2 angezeigt
    zweimal mache, wird beim zweiten Anlauf (ohne die oben erwähnte COdeänderung) das Richtige angezeigt.
    So. Ich habe die Wartezeit genutzt und ein Event erstellt (kann ja nix passieren - mein Code geht ja eh nicht :o)
    Dazu habe ich im Load Event der Form UcKundenbestellung.AddHandlerForOpenCustomerOrder() und auf der Form folgenden Code hinzugefügt:

    VB.NET-Quellcode

    1. Public Event CustomerOrderFound(BSCurrent As Object)
    2. Private Sub AddHandlersForOrders()
    3. AddHandler UcLieferungen.OpenCustomerOrderFound, AddressOf SearchSupplierAndShowCustomerOrderPage
    4. End Sub
    5. Private Sub SearchSupplierAndShowCustomerOrderPage(BSCurrent As Object)
    6. RaiseEvent CustomerOrderFound(BSCurrent)
    7. End Sub


    und auf der UCKundenbestellung dann:

    VB.NET-Quellcode

    1. Public Sub AddHandlerForOpenCustomerOrder()
    2. AddHandler frmHaupt.CustomerOrderFound, AddressOf EventTest
    3. End Sub
    4. Private Sub EventTest(BSCurrent As Object)
    5. Dim SelectedSupplier = DirectCast(DirectCast(BSCurrent, DataRowView).Row, DtsDaten.LieferantRow)
    6. MessageBox.Show(SelectedSupplier.Name)
    7. End Sub


    Funktionieren tuts, aber ist dieser Weg der Richtige? Ich brauche ja immer noch eine Public Sub, um meinen Handler anzulegen.
    AddHandler frmHaupt.CustomerOrderFound, AddressOf EventTest 8|
    Finger weg von frmHaupt innerhalb des UCs! frmHaupt ist eine implizite frmHaupt-Property und sollte nicht verwendet werden, solange das nicht absolut nötig ist. Und das ist es nicht.
    Wenn Deine frmHaupt-Instanz SearchSupplierAndShowCustomerOrderPage aufruft, soll es einfach eine API-Methode (also eine Friend Sub oder Public Sub) des UCs aufrufen und fertig. Dafür brauchst Du kein Event.

    ##########

    Zu dem BS.Current-Problem: Ich hab leider erstmal nur meinen Delay-Workaround:

    VB.NET-Quellcode

    1. Public Async Sub SetSupplierToShow(BSCurrent As Object)
    2. For i = 0 To BSLieferant.Count - 1
    3. If DirectCast(BSLieferant.Item(i), Data.DataRowView).Row.Equals(DirectCast(BSCurrent, Data.DataRowView).Row) Then
    4. _BSFilteredBySupplierIsActivated = True
    5. SetBindingSource()
    6. Await Task.Delay(1)
    7. BSLieferant.Position = i
    8. Exit For
    9. End If
    10. Next
    11. 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.

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

    Warum sollten Public Subs schlimm sein ?( Sowas nennt man API.
    Ok, ich benutz meistens Friend, damit man die nicht von außerhalb des Projekts erreichen kann, indem man derDieDas Assemly einbindet. Aber meine Regel ist: Man hat einen Eigentümer und ein Eigentum. Eigentümer ist die Klasseninstanz, die selber eine andere Klasseninstanz (Eigentum) erzeugt und somit auf diese Zugriff hat. Das Eigentum hat wiederum kennt seinen Eigentümer nicht.
    Beispiel: Button. Ein Form (Eigentümer) erzeugt einen Button (Eigentum) und kann fast mit dem machen, was es will. bzw was der Button so über sein API anbietet. Da wird dann einfach geschrieben: Button1.Text = "Klick mich". Da muss das Form kein Event an den Button schicken, dass der seinen Text ändern soll. Aber wenn der Button (innerhalb der Button-Klasse!) etwas am Form ändern will, dann muss es ein Event schicken, weil er ja normalerweise nicht weiß, wer der Eigentümer ist. Klar, ein Control kennt Parent, aber bei einer von Dir erstellten Klasse gibt es Parent normalerweise nicht. Daher muss die Eigentumsklasse ein Event schicken, um mit dem Eigentümer zu interagieren. Aber der Eigentümer kann das Eigentum normalerweise direkt manipulieren.
    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.
    Soho.
    Der Delay Workaround hat geholfen. Aber das hast du ja mit Sicherheit schon getestet.
    Ich habe nun das unsinnige Event entfernt. Aller Code funktioniert, wie er soll. Ich würde mich jetzt ans nächste machen. Oder gibts noch was zu meckern?

    Edit: und wie findest du / findet ihr das Programm eigentlich rein optisch? Was würdet ihr hier anders machen?

    und ein Edit2, würdet ihr die derzeit gültigen Steuersätze fest im Code hinterlegen (und wenn nötig über ein Update ändern), oder würdet ihr eher dem Nutzer die Möglichkeit geben, den vollen und den ermäßigten Steuersatz in den Einstellungen festzulegen?

    und das letzte Edit: Ich mache mich jetzt an die Artikel. Dazu ein aktueller Screenshot meines DataSets.
    Von welchem Typ sollten die Zahlenspalten sein? Also Listenpreis, Rabatt, Einkaufspreis, Marke, Verkaufspreis, sowie alterEinkaufspreis und neuerEinkaufspreis.
    Im bisherigen Programm ist das alles double. Es bietet sich ja aber, zumindest für die Spaltendie einen Preis enthalten, Decimal an.
    Ich lese aber, dass Double besser (schneller) verarbeitet werden kann, als Decimal. Der einzige Vorteil von Decimal ist die höhere "HinterkommastellenGenauigkeit". Bei mir wird aber eh auf zwei Hinterkommastellen gerundet.
    Bilder
    • Unbenannt.png

      129,41 kB, 1.920×1.080, 31 mal angesehen
    Dateien
    • Theo.zip

      (958,78 kB, 24 mal heruntergeladen, zuletzt: )

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

    Ich schau in ruhiger Minute nochmal, wie man den Workaround entfernen kann.
    Optisch? Nicht mein Ding. Ich mag das Grau einfach nicht. IconButtons sollten zumindest ein ToolTipText haben, damit man weiß, was geschieht, wenn man draufklickt.
    Steuersätze in die Einstellungen. Nach den vergangenen Jahren wissen wir, dass sich die auch mal zeitweise ändern kann.
    Beträge speichere ich inzwischen als Cent und somit Integer.
    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.
    Würdest du dich dann über eine Einstellung freuen, mit der du die Hintergrundfarbe festlegen kannst, oder eher mit dem grau leben?

    Und meinst du nicht, dass als Cent speichern an dieser Stelle eher hinderlich ist?
    Also ich meine, ich muss ja vor jedem Zugriff, vor jeder Anzeige den Preis ausrechnen.
    Und ein speichern in Cent bringt mir doch hier sonst weiter nichts. (Rundungsdifferenzen tauchen ja hier nicht groß auf, bzw. sind nicht schlimm.
    Gerechnet wird nur ListenEK - Rabatt. EK + Steuer + Marge.
    Oder eben Abwandlungen davon.

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

    Ich würd nicht erwarten, dass das Programm mir ne Hintergrundfarbeneinstellmöglichkeit gibt. Ich würd als Programmierer/Designer einfach ne andere Farbe machen. Wie gesagt: Geschmackssache.
    Ich habe in einem älteren Programm auch Beträge als Double gespeichert und war »überrascht«, warum da Werte wie 123,1000000009 in der Datenbank gespeichert werden. Daher der Wechsel zu Integer und Cent.
    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.
    Aber wenn ich zu Integer wechsle, habe ich doch statt 123,10000009 halt 12310000009 in meiner Datenbank?
    Mich würde allerdings dieser Double Wert in meiner DB auch keineswegs stören. Ich werde ihn an jeder Stelle auf zwei Kommastellen gerundet anzeigen.
    Das müsste ich doch mit einem Integer genauso, oder irre ich mich hier? Mit hundert multiplizieren und auf zwei Kommastellen gerundet angeben.
    Sorry, aber ich kann mich da nicht so recht mit anfreunden. Fällt das auch eher in die Kategorie: Geschmackssache?
    Oder ist es ehr ein "Junge Speicher den Mist als Integer, du hast sonst nur Ärger, ich weiß wovon ich rede"? - dann höre ich natürlich sofort auf zu murren und stell auf integer um.

    Und dann habe ich auch wieder neue Fragen zum Programm (das schöne ist ja, dass sich durch die UserControls der Code leicht erweitern, und sich später (wenn du eine ruhige Minute hast, und doch noch was zu meckern findest), eine andere UC leicht ändern lässt :o):
    Im Upload neu hinzugekommen sind UCArtikel und frmArtikelBearbeiten, sowie ein paar neue DataTables und zwei TabPages auf der UCEinstellungen (aber es interessieren nur die beiden hervorgehobenen Controls).
    Das UCArtikel beherbergt ein DGV zur Anzeige der Artikel, sowie Buttons zum neu anlegen, bearbeiten und kopieren.
    Diese drei Aufgaben möchte ich ausnahmsweise mal nicht mit den Helpers erledigen. Ich möchte nämlich das ArtikelBearbeitenForm nicht modal anzeigen.
    Später werde ich nämlich die UCArtikel um ein WebView2 Control erweitern. Dieses nutze ich (in meinem jetzigen Programm auch schon) zur Anzeige von Rechnungen.
    Es ist in der Handhabung sehr lästig, wenn man auf dieser Rechnung nichts kopieren kann, oder nicht scrollen kann, solange die frmArtikelBearbeiten angezeigt wird.

    Ich habe versucht das ganze mit den Helpers und auch als Dialog in einem neuen Thread (Async und Await Task Sub() ShowArticleForm()) zu lösen, aber geht nicht :(

    Meine Lösung ist nun der Code hier im Anhang (zumindest der Anfang, bzw. das Grundgerüst davon). Funktionieren tuts, aber geht das so?

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

    Sowas wie 123,10000009 würde dann gar nicht mehr auftauchen, sondern nur noch 12310 (Cent). Decimal wurde ja auch von Dir selbst schon genannt. Der eine so, der andere so.
    Den Rest schau ich mir irgendwann mal an.
    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.