C#-Code voneinander trennen

  • C#

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    C#-Code voneinander trennen

    Moin,

    Das einte C#-Programm wird langsam immer grösser von mir.

    Nun:
    Gibt es eine Möglichkeit die Codes voneinander zu trennen um bessere Ordnung/Übersichtlichkeit zu schaffen?

    Gibt ja die folgenden Funktionen in Visual Studio:
    - Klasse Hinzufügen
    - Benutzersteuerelement Hinzufügen
    - Komponente Hinzufügen
    - Neue Datenquelle hinzufügen.

    Ich denke dies lässt sich mit "Klassen" bewerkstelligen.
    Wie funktioniert hier der Verweis?

    Ähnlich wie sowas:

    z.B. in einem

    C#-Quellcode

    1. private void cmdErstellen_Click(object sender, EventArgs e)
    2. {
    3. Kunde();
    4. }
    5. private void Kunde()
    6. {
    7. Auszuführender Code;
    8. }


    Was muss ich hier speziell beachten? Gibt es dafür spezielle Regeln, welche ich einhalten muss?

    Habe mein Code noch nie abgegrenzt...

    Kurz gesagt:
    Ich will ganz einfach mehrfach auf einen grösseren Code verweisen und diesen ausführen lassen, ohne ständig auf und abscrollen zu müssen und den ganzen Code ansehen.
    Somit kann ich auch spezifischer auf einen "Bereich" zurückgreifen, welche ich optimieren möchte.

    Gruss Newsletter

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

    newsletter schrieb:

    Wie funktioniert hier der Verweis?
    So:

    C#-Quellcode

    1. Class xyxy
    2. {
    3. public void DoIt();
    4. }
    5. // Main Form z.B.
    6. private void button1_Click()
    7. {
    8. xyxy xy = new xyxy();
    9. xy.DoIt();
    10. }

    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 es mal gemacht und einen Code reingenommen...

    Nun kommen folgende Fehlermeldungen:

    C#-Quellcode

    1. Fehler CS0103 Der Name "txtPlz" ist im aktuellen Kontext nicht vorhanden.

    also gem. Code meint er txtPlz.Text, txtStrasse.Text etc...

    Das er Word nicht mehr erkennt habe ich mit dem Using behoben... aber woran kann das bei den Textboxen liegen?


    ##Frage:
    Muss ich jetzt wirklich jede Textbox im Designer auf "Public" stellen, damit das funktioniert?
    z.B.

    C#-Quellcode

    1. private System.Windows.Forms.TextBox txtVorname;
    2. auf
    3. public System.Windows.Forms.TextBox txtVorname;

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

    @newsletter Du musst schon etwas Code dazu posten.
    Wo ist txtPlz deklariert, wo tritt der Fehler auf?
    Klasse(n) und Prozedur(en).
    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!
    In der Main Form:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. using Word = Microsoft.Office.Interop.Word;
    11. using System.Reflection;
    12. namespace Plattform
    13. {
    14. public partial class FrmPL : Form
    15. {
    16. public FrmPL()
    17. {
    18. InitializeComponent();
    19. //Toolhelp
    20. ToolHelp();
    21. Initialisierung();
    22. }
    23. private void cmdErstellenDocx_Click(object sender, EventArgs e)
    24. {
    25. Worduebergabe Kunde = new Worduebergabe();
    26. Kunde.Kunden();
    27. }




    Neu angelegte Klasse:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using Word = Microsoft.Office.Interop.Word;
    7. namespace Plattform
    8. {
    9. class Worduebergabe
    10. {
    11. public void Kunden()
    12. {
    13. //Word Dok öffnen:
    14. Word.Application WordApp = new Word.Application();
    15. WordApp.Visible = true;
    16. object fileName = "C:\\Users\\admin\\Desktop\\App\\Lohnabrechnung.docx";
    17. object readOnly = false;
    18. object isVisible = true;
    19. object missing = Type.Missing;
    20. Word.Document myDoc = WordApp.Documents.Open(ref fileName, ref missing, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible, ref missing, ref missing, ref missing);
    21. myDoc.Activate();
    22. object oAnsprache = "Ansprache";
    23. Word.Range Ansprache = myDoc.Bookmarks.get_Item(ref oAnsprache).Range;
    24. Ansprache.Text = ComAnsprache.SelectedItem.ToString();
    25. object oVorname = "Vorname";
    26. Word.Range Vorname = myDoc.Bookmarks.get_Item(ref oVorname).Range;
    27. Vorname.Text = txtVorname.Text;
    28. }
    29. }
    30. }



    Naja die Klassen-Namen etc ... mir ist nichts besseres eingefallen ;)

    newsletter schrieb:

    In der Main Form:
    Wo kommt da txtPlz vor?
    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!
    In der Main Form kommt "txtPlz" nirgends mehr vor, also einfach in der optischen Form, habe nur eine optische...
    (Habe es einfach rüberkopiert)
    ---------:

    Also so war mein Vorgehen:
    Textbox genommen, auf Form geschoben, umbenennt in txtPlz.

    Button genommen, umbenennt, doppelt angeklickt, code reingeschrieben, und in die neue klasse reingenommen (ctrl+x)

    Was muss ich machen, damit in der neuen Klasse der Fehler nicht mehr auftaucht? ;)

    Kurz:
    Ich habe sie eigentlich garnie deklariert... Die ist glaub beim einfügen standartmässig ein String?

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

    Okay, dann hier mal ein paar wichtige Informationen für dich:
    Formulare, oder kurz, Forms, haben immer eine "Codedatei" (DeineForm.cs) und eine "Designerdatei" (DeineForm.designer.cs). Wenn du z.B. auf einen Button nen Doppelklick machst, wird für dich automatisch in der Designerdatei das Event abboniert (button1.Click += button1_Click;), und in der Codedatei der Eventhandler erzeugt (void button1_Click(object sender, EventArgs e)).
    Etwas sehr ähnliches passiert, wenn du ein Control auf die Form ziehst, es wird für dich automatisch in der Designerdatei ein Objekt vom Typ TextBox erstellt, und als variable mit dem Namen textbox1 deklariert. Ebenso werden noch verschiedene Eigenschaften wie z.B. die Position etc. aktualisiert, wenn die die Box auf der Form herumschiebst.
    Während du die meiste Zeit mit der Codedatei verbringst, wirst du äußerst selten mal die Designerdatei sehen, da sie sowieso zumeist von VisualStudio verwaltet wird.
    Alles was du auf die Form schiebst, ist demnach erstmal nur der Form bekannt. Eine Klasse kann also erstmal nicht auf die Controls zugreifen. Doch wollen wir das überhaupt? Soll eine extra Klasse wirklich auf die controls zugreifen? Oder wollen wir nicht eher, dass bei einer gewissen Aktion eines Users, in einer externen Klasse etwas passiert? Anstatt also die Klasse etwas mit den Controls machen zu lassen, reagieren wir auf ein Event, und lassen dann Code in der Klasse ausführen. Wir können dann immernoch über Parameter die Controls, oder deren Werte an Objekte der Klasse übergeben, doch wie schon gesagt, wollen wir recht selten, dass eine andere Klasse direkt auf die Controls zugreift.
    Ich würde mein aktuelles Projekt bei Seite schieben und mich ganz der OOP und deren Prinzipien widmen. Erst wenn du die drauf hast, kannst du deine neune Kenntnisse in deinem Projekt einbauen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @newsletter Auch wenn das für C# nicht relevant ist, zur Parameterübergabe und zur Hin-Rück-Übertragung von Informationen zwischen Forms gugst Du auch hier.
    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!
    Um nochmal auf die Eingangsfrage zurückzukommen:

    newsletter schrieb:

    Kurz gesagt:
    Ich will ganz einfach mehrfach auf einen grösseren Code verweisen und diesen ausführen lassen, ohne ständig auf und abscrollen zu müssen und den ganzen Code ansehen.
    Somit kann ich auch spezifischer auf einen "Bereich" zurückgreifen, welche ich optimieren möchte.
    Dafür gibt es kein Patentrezept.
    Sondern du musst dir überlegen, was dein Programm eiglich macht, und ob du dabei sog. "Concerns" - Verantwortlichkeiten - identifizieren kannst.
    Derlei Verantwortlichkeiten kann man dann schön in je einer Datei zusammenfassen.
    Bei den Dateien mag es sich um class-Dateien handeln, aus denen dann per Code Objekte gebildet werden.
    Dieses ist angezeigt, wenn es mehrere gleichartige Objekte geben können soll, mit je verschiedenem Inhalt.

    Oder man nimmt eine static class, wenn es sich um zustandslose Funktionalität handelt.
    Etwa die Verwaltung eines Word.Application-Objektes würde ich als zustandslos behandeln, denn ich könnte es nicht brauchen, wenn mein Proggi mehrere Word-Instanzen gleichzeitig in den Speicher lädt.