Autor Beitrag
ottto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 04.09.19 14:58 
Hallo Zusammen,
Ich hab zwei Fenster von denen ich gleichberechtigt auf eine DataTable zugreifen möchte. (Der Zugriff über eine DataGridView funktioniert wenn ich die DataTable und die DataGridView in einer Form deklariere.) Gibt es eine "zentrale Stelle" an die die DataTable gehört um den gleichberechtigten Zugriff von beiden Fenstern zu ermöglichen?
Beim Versuch die Deklaration in die Program-Klasse zu packen, bekomme ich, bei der Zuweisung der DataSource(DgvSP.DataSource = dt;) in der Form, die Fehlermeldung: "Der Name "dt" ist im aktuellen Kontext nicht verhanden".
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            
            Application.Run(new Form1());
        }
        DataTable dt = new DataTable("Person");
    }


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
    public partial class Form2 : Form
    {
        private readonly Form1 fh;
        
        public Form2(Form1 aufrufer)
        {
            fh = aufrufer; //S258

            
            InitializeComponent();
        }
        //DataTable dt = new DataTable("Person");

        private void Form2_Load(object sender, EventArgs e)
        {

            DGVSP.DataSource = dt;
        }
    }


Wäre prima, wenn jemand einen Tipp hätte.
Vielen Dank.
ottto
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Mi 04.09.19 15:32 
Hallo,

dein Feld dt wird von dir im Hauptprogramm definiert und ist entsprechend nur dort bekannt. Wenn du es in deinen Forms verwenden willst, dann musst du es auch dort bekannt machen.

Wie es aussieht, wird dein Form2 ja aus dem Form1 aufgerufen. Somit kannst du dein DT auch im Form1 anlegen und das Hauptprogramm aus dem Spiel lassen.

dies kannst du z.B. mit einem public property machen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public partial class Form1 : Form
{
  
  {...}

  public DataTable dt { get; protected set; } = new DataTable("Person");
  
}


das könntest du dann im Constructor deines Form2 verwenden:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
public partial class Form2 : Form
{
  {...}
  
  public Form2(Form1 aufrufer)
  {
    fh = aufrufer; //S258
    DGVSP.DataSource = fh.dt;
    
    InitializeComponent();
  }
  
  {...}
}


So könntest du den von dir gewünschten Effekt erreichen. Ob es eine gute Idee ist, aus beiden Forms auf das gleiche Objekt zuzugreifen wage ich zu bezweifeln, aber beurteilen könnte ich dass nur wenn ich dein Projekt besser kennen würde. Da muss aber jeder seine eigenen Erfahrungen machen.

Gruß

PS: Ich würde übrigens auch auf diese zwei Buchstaben Bezeichner verzichten. Heute weist du noch, was fh.dt bedeutet, in drei Monaten aber nicht mehr ein "ParrentForm.PersonData" oder ähnliches wäre da bestimmt verständlicher ;).

Für diesen Beitrag haben gedankt: ottto
ottto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 04.09.19 16:28 
Info zum Projekt:
Nachdem Durcharbeiten eines Grundlagenbuches hab ich mir überlegt einen kleinen Vokabeltrainer, als praktische Übung, zu basteln.
Im ersten Fenster sollen anhand einer bestehenden Datenmenge(Vokablen in einer DataTable) verschiedene Übungen möglich sein. In einem zweiten Fenster, welches aus dem ersten gestartet werden kann, soll der Datenbestand entsprechend gepflegt werden können. Die Funktionalität der Übungen und der Datenpflege per DataGridView sowie die Speicherung der Daten ist in Einzelteilen fertig. Jetzt war halt meine Überlegung die Datenbasis "zentral" abzulegen, da beide Fenster "irgendwie" gleichberechtigt auf die gleichen Daten zugreifen. Wenn ich Dich richtig verstehe, ist das aber eher unüblich. Von daher werde ich versuchen die DataTable in die Form1(Hauptfenster) zu packen und die Daten dann aus der Form2, in der Form1, pflegen.
Vielen Dank für die schnelle Antwort.
ottto
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 04.09.19 19:17 
Zitat:
Jetzt war halt meine Überlegung die Datenbasis "zentral" abzulegen, da beide Fenster "irgendwie" gleichberechtigt auf die gleichen Daten zugreifen. Wenn ich Dich richtig verstehe, ist das aber eher unüblich.


Unüblich ist das überhaupt nicht. Dinge/Aspekte voneinander zu trennen ist eigentlich eins der Dinge die gute von schlechter Software unterscheiden. Ich/wir könnten dich jetzt mit üblichen Mustern zuwerfen wie man das in "richtiger" Software löst. Ich glaube das würde dir aber im Moment noch nicht helfen da das zu viel Komplexität mitbringt und im an-betracht des von dir angedachten Beispiels auch überdimensioniert wäre.

Ein kleiner Gedanke der dir vielleicht hilft. Du fragst dich wie du an deine DataTable an bestimmten Stellen kommst. Das gleiche Problem hast du eigentlich schon mit Form1 gehabt und offensichtlich gelöst. Wie kann ich von Form2 aus auf Form1 zugreifen? Deine Lösung war Form1 an Form2 zu übergeben. Diese Lösung funktioniert natürlich auch für jede andere Klasse wie zum Beispiel DataTable(s). Man kann sie einfach an den übergeben der sie kennen soll. Und das was in Form2 funktioniert, funktioniert natürlich auch schon in deiner Form1. Die wird in der Programm Klasse erzeugt und der kann man natürlich dort auch einfach was (z.b. im Konstruktor wenn man den passenden programmiert) mit übergeben.

Für diesen Beitrag haben gedankt: ottto
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 04.09.19 19:38 
Hallo,

du kannst dir auch mal meinen Artikel Kommunikation von 2 Forms dazu durchlesen.

Für diesen Beitrag haben gedankt: ottto
ottto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 05.09.19 16:14 
Ich hab die DataTable in die Form1 gepackt. Zugriff aus der Form2 funktioniert.
Vielen Dank für Eure Hilfe!!!