Mitgliederverwaltung - Hilfe bei der Erstellung sauberen Codes

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 244 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Sagt mal, würdet ihr die TabPages in meinen Einstellungen auch trennen?
    Also für jede Einstellungen TabPage z.B. eine eigene Form?
    Oder kann das bleiben so wie es ist (als TabPages eben) - weil der Code ja sehr überschaubar ist und das ganze ja auch thematisch zusammenhängt?
    ich hab deine Einstellungen grad nicht im Detail im Kopf - daher eher generell:
    Komplexe Dinge auf einem Tab kommen bei mir in ein Ucl.
    Also ein DGV mit mw. ein paar Detail-Controls, die an derselben BindingSource hängen - das kann maximal noch auf dem Tab bleiben.
    Aber nur, wenn keine Logik dahinter steckt.
    Oder anders: Wenn ein Tab nur eine BindingSource "beansprucht" und(!) keine weitere CodeBehind-Logik - dann lager ich nicht in ein ucl aus.
    Ausnahmen werden in Massen geduldet.
    Hängt auch vom Tab-Parent ab: ZB wenn der TabParent das MainForm ist - dessen CodeBehind ist meist eh schon ziemlich voll mit verschiedensten Dingen - da bin ich froh um jede Zeile, die ich auslagern kann.
    Ist der TabParent ein anderes Ucl, so ist eher möglich, da ein bischen weiteren Kram zuzulassen.

    Ansonsten ists ja kein Act, einen zu komplex werdenden Tab umzumodeln.

    Ich folge da einem ganz ganz generellen Prinzip: Auslagern, wenn das Ding zu gross wird.
    (Dieses Prinzip wenden sogar schon die Amöben an.)

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

    Soho.
    Ich habe jetzt die Änderungsvorschläge von @tragl verstanden und übernommen (mit einer Ausnahme. siehe unten). Außerdem habe ich das Projekt nun komplett mit MDI gestaltet und meinen Code hübsch getrennt.
    Die Einstellungen habe ich dabei aber zusammen gelassen und in einer TabControl organisiert. Sind zwar 3 BindingSources, aber sogut wie kein Code.
    Die Buttons haben keine Bildchen mehr, sondern aussagekräftige Beschriftungen. Außerdem habe ich die "Home Seite" entfernt. Ihre Aufgabe übernimmt nun ein MenuStrip.
    Ich habe aber noch drei Fragen zum Code:
    1. @ErfinderDesRades
    Du lädst und speicherst das DataSet aus xml mit folgendem Aufruf:
    Dts.DataFile("..\..\DataStuff\AngelmarkenData.xml").Register(Me, handleFormClosing:=True).Fill
    Zur Laufzeit muss ja der Pfad geändert werden. Warum heißt dein Code dann nicht:

    VB.NET-Quellcode

    1. If System.Diagnostics.Debugger.IsAttached Then
    2. Dts.DataFile("..\..\DataStuff\AngelmarkenData.xml").Register(Me, handleFormClosing:=True).Fill
    3. Else
    4. '"normaler" Pfad
    5. End If


    2. @tragl
    Deine KeyDown Idee in der frmKunden funktioniert glaube ich nicht. Denn: ' 'Mit Else werden dann die übrigen Tasteneingaben an die Suchen-Textbox übergeben wären zu viele Tasten die abgefangen werden müssen (Strg, Alt, alle F-Tasten, ...)
    Daher habe ich da wieder meinen Code reingeschmissen und deinen auskommentiert. Ich glaube dass KeyPress Event ist hier sinnvoller, denn diese Problematik ist hier nicht.
    Ich bekomme es aber nicht hin, dass mein Event feuert, wenn die Seite angezeigt wird - ich muss erst, auf der Form was anklicken. Habe PersonDataGridView.Focus() versucht, bringt aber nix.
    Ich halte aber ein KeyEvent der Form für sinnvoller. Ein KeyEvent des DGV würde ja z.B. nicht funktionieren, nachdem ich auf den Button "neuer Kunde" geklickt habe.
    Wäre es evtl. denkbar ein KeyEvent der MainForm zu verwenden und die gedrückte Taste, sowie da gerade angezeigt MDIChild an eine Sub in der entsprechenden MDIChild Form zu übergeben?
    Diese verwertet dann die Eingabe und führt entsprechende Aktionen aus?

    3. Ich habe bevor ich angefangen hab, mein Projekt umzustellen die alten Forms umbenannt. Habe allen ein "OLD" vor dem Namen verpasst.
    Damit meine fertige Solution nun aber läuft, musste ich den gesamten Code im Modul Program.vb auskommentieren. Hier stand:
    Private Iterator Function CreateForms() As IEnumerable(Of Form)
    Yield New OLDfrmAngelmarken
    End Function
    Denn nach der vollständigen Umstellung, habe ich alle "OLD" Forms gelöscht. In der Funktion hier bringt es aber auch nichts, die frmMain zu verwenden.
    Aber mein Programm läuft ja auch ohne das Modul. Wozu ist es dann gut?
    Dateien
    • Angelmarken04.zip

      (312,03 kB, 28 mal heruntergeladen, zuletzt: )

    DerSmurf schrieb:

    1. @ErfinderDesRades
    Du lädst und speicherst das DataSet aus xml mit folgendem Aufruf:
    Dts.DataFile("..\..\DataStuff\AngelmarkenData.xml").Register(Me, handleFormClosing:=True).Fill
    Zur Laufzeit muss ja der Pfad geändert werden...
    Wieso muss der zur Laufzeit geändert werden? Dat funzt doch zur Laufzeit, oder?

    Ah - du meinst vermutlich, dass die ReleaseVersion einen anderen Pfad benutzen soll!
    Da nimmt man normalerweise CompilerKonstanten für, in etwa:

    VB.NET-Quellcode

    1. #If DEBUG Then
    2. Dim sFile = "..\..\DataStuff\AngelmarkenData.xml"
    3. #Else
    4. Dim sFile = "normaler Pfad"
    5. #End If
    6. Dts.DataFile(sFile).Register(Me, handleFormClosing:=True).Fill
    Ich würde das eher nicht an .Debugger.IsAttached hängen, weil auch an eine Release-Kompilierte Anwendung kann man einen Debugger anhängen.
    (Aber vlt. konkret nicht wichtig - wer tut denn sowas)
    Ja, genau das meinte ich.
    Also der Pfad ..\..\DataStuff\ ist ja nicht praktikabel, wenn ich das Programm dann später ausführe.
    Hat es einen Grund, dass du diesen Pfad dann von Hand änderst und eben nicht den Code oben verwendest?

    DerSmurf schrieb:

    ich muss erst, auf der Form was anklicken.

    Dann pack das in's Form-KeyDown und probier ma Me.KeyPreview = True im FormLoad oder in Sub New - normal sollte er dann immer auf die Tasten reagieren
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    DerSmurf schrieb:

    Hat es einen Grund, dass du diesen Pfad dann von Hand änderst und eben nicht den Code oben verwendest?
    Verstehe nicht, was du mit "von Hand ändern" meinst.
    Hast du meinen Code mal bei dir eingepastet? Schau dir das mal an, und versteh, dass da wird nix geändert wird.
    Schau dir das auch mal an unter CompileOption.Release

    ErfinderDesRades schrieb:

    Verstehe nicht, was du mit "von Hand ändern" meinst.

    Ich meine damit, wenn ich den Code: ​ Dts.DataFile("..\..\DataStuff\AngelmarkenData.xml").Register(Me, handleFormClosing:=True).Fill verwende, muss ich - bevor ich das Programm z.B. auf einen anderen PC kopiere, der das Programm dann ausführt - den Pfad ändern. Warum machst du das so, und verwendest eben nicht, den Code:

    VB.NET-Quellcode

    1. ​#If DEBUG Then
    2. Dim sFile = "..\..\DataStuff\AngelmarkenData.xml"
    3. #Else
    4. Dim sFile = "normaler Pfad"
    5. #End If
    6. Dts.DataFile(sFile).Register(Me, handleFormClosing:=True).Fill


    tragl schrieb:

    Dann pack das in's Form-KeyDown und probier ma Me.KeyPreview = True im FormLoad

    ändert leider nichts. Ich muss nach wie vor ein Control in der frmKunden anwählen.

    Könnte ich auch noch eine Antwort auf meine 3. Frage bekommen? Wofür ist das Modul Prgram.vb? Und warum funktioniert mein Programm wie vorher, wenn ich den kompletten Code hierin auskommentiere?
    Spoiler anzeigen
    ​3. Ich habe bevor ich angefangen hab, mein Projekt umzustellen die alten Forms umbenannt. Habe allen ein "OLD" vor dem Namen verpasst.Damit meine fertige Solution nun aber läuft, musste ich den gesamten Code im Modul Program.vb auskommentieren. Hier stand:Private Iterator Function CreateForms() As IEnumerable(Of Form)Yield New OLDfrmAngelmarkenEnd FunctionDenn nach der vollständigen Umstellung, habe ich alle "OLD" Forms gelöscht. In der Funktion hier bringt es aber auch nichts, die frmMain zu verwenden.Aber mein Programm läuft ja auch ohne das Modul. Wozu ist es dann gut?


    Außerdem habe ich noch eine Frage: Warum muss ich mit der MDI Geschichte hier die Forms vorher nicht initialisieren?
    Statt

    VB.NET-Quellcode

    1. Using KundenForm as new frmKunden
    2. Kundenform.show
    3. End Using​

    nehme ich einfach ​frmKunden.ShowMdiChild

    DerSmurf schrieb:

    Warum muss ich mit der MDI Geschichte hier die Forms vorher nicht initialisieren?
    Du hast recht: Weil an der Stelle genau mit dem Dreck gearbeitet wird, den man eben nicht nutzen sollte: thread-dependent-properties (s. Warum »Form1.Show« und Co. einem irgendwann ins Bein schießen). Du solltest dringend dort den Dir bekannten Instanziierungsvorgang vornehmen. Alles andere wäre Rückfall in VB6-Zeiten. Da muss man doch glatt fragen, auf wessen Mist diese Codezeilen gewachsen sind.
    Klar, Du kannst nicht mit Using arbeiten, da das nur mit ShowDialog sinnvoll klappt, weil mit Show die Forminstanz nach wenigen Mikrosekunden wieder plattgemacht wird. Dementsprechend musst Du langlebige Variablen nutzen.
    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.

    DerSmurf schrieb:

    ErfinderDesRades schrieb:

    Verstehe nicht, was du mit "von Hand ändern" meinst.

    Ich meine damit, wenn ich den Code: ​ Dts.DataFile("..\..\DataStuff\AngelmarkenData.xml").Register(Me, handleFormClosing:=True).Fill verwende, muss ich - bevor ich das Programm z.B. auf einen anderen PC kopiere, der das Programm dann ausführt - den Pfad ändern. Warum machst du das so, und verwendest eben nicht, den Code:

    VB.NET-Quellcode

    1. ​#If DEBUG Then
    2. Dim sFile = "..\..\DataStuff\AngelmarkenData.xml"
    3. #Else
    4. Dim sFile = "normaler Pfad"
    5. #End If
    6. Dts.DataFile(sFile).Register(Me, handleFormClosing:=True).Fill
    Ich kapiers nicht.
    Ich verwende den Code doch - der ist doch von mir.
    Das bedeutet ich sollte (muss) aus frmVerkauf.ShowMdiChild,

    VB.NET-Quellcode

    1. Dim Verkaufform as new frmVerkauf
    2. Verkaufform.showMdiChild
    machen.

    @ErfinderDesRades
    Ah sorry. In deinem DataSetTemplate taucht das #If Deubg nicht auf. Ich dachte daherdu nutzt es aus irgendeinem Grund nicht. Hab nicht gepeilt, dass du es doch verwendest, es nur im Template nicht enthalten ist.
    Jup. Zumindest meine Empfehlung.
    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.

    DerSmurf schrieb:

    Ah sorry. In deinem DataSetTemplate taucht das #If Deubg nicht auf. Ich dachte daherdu nutzt es aus irgendeinem Grund nicht. Hab nicht gepeilt, dass du es doch verwendest, es nur im Template nicht enthalten ist.
    Ich verwende sowas, wenn ich Release-Versionen benutzen will.
    Das ist nur äusserst selten der Fall.
    Was ich privat programmiere, sind ja immer nur Experimente, ProofOfConcepts, etc.
    Alles klar.
    Dann warten wir Mal was @tragl zur Instanzierung der Forms sagt.
    Von ihm ist ja schließlich der Code.

    Außerdem hätte ich gerne eine Antwort auf meine Frage Nummer 3 :(
    @ErfinderDesRades ich glaube dass Modul Program.vb ist Teil deines Templates.
    Was macht es? Und warum geht mein Code problemlos, wenn ich das gesamte Modul auskommentiere?
    Ah. Der Code im Modul Program.vb konnte nicht ausgeführt werden, weil durch tragls Änderungen die Sub New der Mainform Private war. Deswegen nicht Aufrufbar durch die Function CreateForms().
    Ich habe aber noch eine Frage hierzu:

    VB.NET-Quellcode

    1. #If DEBUG Then
    2. Dim sFile = "..\..\DataStuff\AngelmarkenData.xml"
    3. #Else
    4. Dim sFile = "Daten\AngelmarkenData.xml"
    5. #End If
    6. Dts.DataFile(sFile).Register(Me, handleFormClosing:=True).Fill

    Wenn ich jetzt den Deug Ordner auf meinen Desktop kopiere, verwendet mein Programm den sFile Pfad aus der ersten Verzweigung (..\..\DataStuff\)
    Was muss ich denn tun, damit mein Programm in den Else Zweig wechselt?
    Ich dachte #If DEBUG bedeutet, wenn ich mein Programm über VS starte.

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

    Ah. Ich musste erstmal googlen. Wusste garnicht, dass ich da was umstellen kann / muss. Jetzt hat auch der release Ordner mal einen Sinn. zimelich cool :)
    Edit: Ich habs direkt oben im Ribbon eingestellt. (Bild unbenannt2)

    Ich habe schonmal angefangen meine Verkaufsform zu designen (siehe Screenshot).Welche Art von Controls würdet ihr verwenden, um auswählbar zu machen, welche Artikel der Kunde kauft? Mir schweben Buttons vor. Aber ich glaube, diese kann ich nicht per Code designen (also nicht dynamisch dem DataSet anpassen), weil ja die Buttons unter umständen eigenen Code enthalten müssen (der eh nicht dynamisch erzeugbar wäre)Die Arikel, um die es geht habe ich auch als Screenshot angehängt. Artikel die den gleichen "BesonderheitCode" haben, gehören dabei zusammen.Es sollen aber nicht alle Artikel sichtbar sein (evtl. eine boolean Row in der DataTable?). Die beiden Artikel DAV Verzug und DAV Neuanmeldung, sollen automatisch eingefügt werden, niemals vom Benutzer direkt.
    Bilder
    • Unbenannt.png

      123,49 kB, 1.920×1.080, 24 mal angesehen
    • Unbenannt1.png

      112,86 kB, 1.920×1.080, 22 mal angesehen
    • Unbenannt2.png

      150,64 kB, 1.920×1.080, 24 mal angesehen

    DerSmurf schrieb:

    zur Instanzierung der Forms sagt.

    wird nicht instanziiert - funzt aber so, denn das Form wird einmal geöffnet und in jedem Fall wieder geschlossen. Ein doppeltes Öffnen geht damit nicht, sondern es wird ja hingewechselt falls es schon offen ist.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: