Eigene Klasse wo erstellen



  • Hallo Leute,

    ich bin relativ neu in C# und WinForms und habe jetzt ein für mich größerers Problem.

    Ich habe eine Klasse, nennen wir Sie "MyClass" erstellt.

    Die , bzw. deren Funktionen will ich in einer Forms Anwendung nutzen. Nun ist die Frage, wo füge ich sie ein, bzw. erstelle ich sie ?

    Ich habe es schon versucht im Form_Load , aber ich kann dann nicht wirklich darauf zugreifen wenn ich sie dort mit z.B.:

    private void Form1_Load(object sender, EventArgs e) {
    
                MyClass v1 = new MyClass()
            }
    

    erstelle, kann ich z.B.: bei einem ButtonClick nicht auf v1.do_sth() zugreifen.

    Wie macht man das richtig ?



  • Die Klasse soll quasi "Global" sein und in der ganzen Form verwendet werden könne, sie stellt hald die benötigten Funktionen für die paar Buttons und so bereit



  • Es gibt Membervariablen.



  • Ja, aber die Frage ist wo ich mein :

    MyClass v1 = new MyClass()

    palzieren muss, damit ich in der ganzen Form auf v1 zugreifen kann..



  • Was dann so aussieht

    private MyClass m_v1;
    private void Form1_Load(object sender, EventArgs e) { 
    
                 m_v1 = new MyClass() 
             }
    

    (Den "m_" Prefix darfst du natürlich auch weg lassen, das ist nur Konvention. Und viele finden das auch doof und/oder unsinnig. Ich find's halt praktisch.)

    ps: Grässliche Formatierung und fehlender ";" sind aus dem Original übernommen 😉



  • Solche Variablen erstellt man am Besten im Konstruktor und macht die Variable dann auch noch readonly:

    private readonly MyClass m_v1;
    
    public Form1() {
      InitializeComponent();
      m_v1 = new MyClass();
    }
    


  • Danke erstmal.
    Ähmm.... auf der msdn Seite hab ich gelesen, man solle gerade im Konstruktor der Forms sowas nicht machen, bzw. nichts einfügen was eine Ausnahme auslösen könnte.
    Leider haben Sie nicht geschrieben, wo man es dann am besten einfügt.



  • Oder gleich bei der Deklaration initialisieren:

    private readonly MyClass _v1 = new MyClaas();
    

    (sofern sie keine Parameter benötigt, welche wiederum von Konstruktorparametern abhängen).



  • forms_newbie schrieb:

    Danke erstmal.
    Ähmm.... auf der msdn Seite hab ich gelesen, man solle gerade im Konstruktor der Forms sowas nicht machen, bzw. nichts einfügen was eine Ausnahme auslösen könnte.
    Leider haben Sie nicht geschrieben, wo man es dann am besten einfügt.

    Wenn du Code ausführst, der potentiell eine Exception wirft, solltest du diese sowieso behandeln - egal ob im Konstruktor oder im Load-Ereignis.



  • Hab das mit den Membervarialben falsch verstanden.

    Wäre das vorgehen an dieser Stelle so richtig :

    Form1.Designer.cs

    partial class Form1 {
            /// <summary>
            /// Erforderliche Designervariable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Verwendete Ressourcen bereinigen.
            /// </summary>
            /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
    
          //My Data
            private readonly MyClass v1 ;
            private string  test = "Test";
          // ///////////////////////////////
            protected override void Dispose(bool disposing) {
                if (disposing && (components != null)) {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    


  • form_newbie schrieb:

    Wäre das vorgehen an dieser Stelle so richtig :

    Nein, es wäre falsch. Von einer Designer-Datei lässt man immer die Finger. Man macht seine Änderungen in der Hauptdatei. In deinem Fall die Form1.cs. Dort gehört die Membervariable rein und auch der Code zum Initialisieren dieser.

    (Wenn du dich fragst, warum eine Klasse über mehrere Dateien verteilt ist.. das ermöglicht das "partial"-Schlüsselwort)



  • So, jetzt aber :

    Form1.cs

    public partial class Form1 : Form {
    
            public string s1  ;         
    
            public Form1() {
                InitializeComponent();
    
            }
    
            private void Form1_Load(object sender, EventArgs e) {
                 s1 = "Hier kommt die Maus";
    
            }
    
            private void AD1_Set_ADR_Click(object sender, EventArgs e) {
    
                MessageBox.Show(this.s1);             
    
            }
    

    So passt ? Wenn ich mal etwas mehr Zeit habe , werd ich mich da besser einlesen. Also die Finger immer von der Designer Datei lassen und in der Form1.cs die eigenen Datentypen einfügen. Passt ?



  • forms_newbie schrieb:

    So passt ? Wenn ich mal etwas mehr Zeit habe , werd ich mich da besser einlesen. Also die Finger immer von der Designer Datei lassen und in der Form1.cs die eigenen Datentypen einfügen. Passt ?

    Ich würde die Stringzuweisung eher im Konstruktor abhandeln, aber abgesehen davon: ja, das passt so 😉


Log in to reply