Autor Beitrag
Exabyte
Hält's aus hier
Beiträge: 10



BeitragVerfasst: So 17.07.11 12:22 
Hallo zusammen!

Ich bin noch ein blutiger Anfänger und möchte in meinem Hauptprogrammcode in der Klasse "Program" auf eine Eigenschaft der Klasse "Form1 : Form" zugreiffen. Die EIgenschaft heisst "filename" und enthält den Pfadnamen der Datei, die gerade geöffnet ist (ich programmiere ein kleines Notepad).

Beim Erstellen der Variable habe ich den getter auf public gestellt:

public string filename {get; private set};

Wenn ich folgenden Code in der Klasse "Program" eingebe, wird die Eigenschaft "filename" jedoch nicht angezeigt:

windowsformsapplication.form1.filename

Hier ist der Programmcode von der Klasse "Form1":

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public string filename { get; private set; }
        public Form1()
        {
            InitializeComponent();
        }

        private void beenden_click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void neu_click(object sender, EventArgs e)
        {
            textbox.Text = "";
        }

        private void öffne_click(object sender, EventArgs e)
        {
            if (openfiledialog.ShowDialog() == DialogResult.OK)
            {
                string path = openfiledialog.FileName;
                textbox.Text = System.IO.File.ReadAllText(path);
                filename = path;
            }
        }

        private void speichernunter_click(object sender, EventArgs e)
        {
            if (savefiledialog.ShowDialog() == DialogResult.OK)
            {
                string path = savefiledialog.FileName;
                System.IO.File.WriteAllText(path, textbox.Text);
            }
        }

        private void speicher_click(object sender, EventArgs e)
        {
            System.IO.File.WriteAllText(filename, textbox.Text);
        }
    }
}


Hier ist der Programmcode der Klasse "Program":

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            WindowsFormsApplication1.Form1.filename // <-------------------------------- funktioniert nicht
        }
    }
}


Kann mir jemand erklären, wie ich auf die EIgenschaft zugreiffen kann?
Vielen Dank für eure Hilfe :D
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 17.07.11 13:01 
Hallo Exabyte,

der Zugriff funktioniert deshalb nicht, weil du zwischen statischen und nicht-statischen Eigenschaften (bzw. Methoden) unterscheiden mußt.
Da du mittels des Klassennamens Form1 darauf zugreifst, werden auch von Intellisense nur statische Eigenschaften angezeigt.

Du mußt aber eine Instanz von Form1 benutzen, d.h.
ausblenden C#-Quelltext
1:
2:
3:
Form1 form = new Form1();
Application.Run(form);
string filename = form.filename;

Bedenke dabei, daß die letzte Zeile erst dann ausgeführt wird, wenn das Hauptfenster geschlossen wird (da Application.Run solange ausgeführt wird).

Btw. benenne deine Klassen am besten gleich beim Anlegen des Projektes besser (anstatt WindowsFormsApplication1 oder Form1).
Und Eigenschaften sollten einen Großbuchstaben am Anfang haben (im Gegensatz zu privaten Feldern), d.h. "Filename".

Zum generellen Thema "Kommunikation zwischen 2 Forms (bzw. Klassen)" habe ich auch einen Artikel geschrieben: Kommunikation von 2 Forms
Exabyte Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: So 17.07.11 13:22 
Danke für die schnelle Hilfe, hat bestens geklappt :D .