C# Gekapselte Felder funktionieren nicht?!

Blackhawk50000

Erfahrenes Mitglied
Hallo liebe Gemeinde =),

eine kurze erklährung zu meinem Programm:

Es gibt 3 Fenster: ein Hauptmenü das zu nicht viel anderem da ist als eines der anderen beiden Festern zu öffnen.

Um das ganze einfacher zu gestallten beschrenken wir uns nur auf das Eingabefenster da es sich bei dem anderen gleich verhällt.

Anfang habe ich das Eingabefenster mehrere male gleichzeitig öffnen können. Duch einbauen einer bool variable habe ich dies dann verhindert. das sah so aus:

PHP:
private bool _Archivierung_Offen;
if (!Archivierung_Offen)
            {
                _Archivierung = new f_Archivierung();
                _Archivierung.Show();
                _Archivierung_Offen = true;
            }
            else
            {
                _Archivierung.Activate();
            }

Hat auch bombig funktioniert.......dachte ich.
Nach einer erfolgreichen Eingabe des Eintrages schließt das Fenster wieder. Doch im Hauptmenü bleibt _Archivierung_Offen auf True.

Da ich das natürlich unmöglich so lassen konnte, wird mein Eingabefenster nun im Closing Event die Eigenschaft Archivierung_Offen des Hauptnemüs auf Fals setzen.
Doch hier entsteht der Fehler. Denn komischer weise bleibt die Variable auf True.

Ich werde nun den Code des Hauptmenüs und das Closing event des Eingabefensters hier herrein koperen.

Danke im Vorraus für eure Hilfe.

Hauptmenü:
PHP:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.OleDb;

namespace SMS_Archiv
{
    public partial class f_Hauptmenue : Form
    {
        #region Deklarationen
        private bool _Archivierung_Offen;
        public bool Archivierung_Offen
        {
            get { return _Archivierung_Offen; }
            set { _Archivierung_Offen = value; }
        }

        private bool _Auslesen_Offen;
        public bool Auslesen_Offen
        {
            get { return _Auslesen_Offen; }
            set { _Auslesen_Offen = value; }
        }
        
        f_Archivierung _Archivierung;
        f_Auslesen _Auslesen;
        public static string _DatenbankPfad = @"Datenbank\SMS-Archiv.mdb";
        private const string _BackupPfad = @"Backup\SMS-Archiv.mdb";
        public OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + _DatenbankPfad);
        #endregion

        public f_Hauptmenue()
        {
            InitializeComponent();
        }

        private void f_Hauptmenue_Load(object sender, EventArgs e)
        {
            if (File.Exists(_DatenbankPfad))
            {
                DateTime _ErstellDatumAlt = Directory.GetCreationTime(_DatenbankPfad);
                if (_ErstellDatumAlt.Month < DateTime.Now.Month)
                {
                    File.Copy(_DatenbankPfad, _BackupPfad, true);
                }
            }
            else
            {
                c_SMS_Functions _Functions = new c_SMS_Functions();

                if (_Functions.ErstelleAccessDatenbank(_DatenbankPfad))
                {
                    string strSQL = "";
                    OleDbCommand SQLQuery = new OleDbCommand(strSQL, con);

                    con.Open();
                    SQLQuery.CommandText = "CREATE Table SMS ( SMS_Text TEXT NOT NULL, SMS_Zeit DATE NOT NULL, SMS_Datum DATE NOT NULL)";
                    SQLQuery.ExecuteNonQuery();
                    SQLQuery.Dispose();
                    con.Close();


                    MessageBox.Show(this, "Datenbank wurde erfolgreich neu angelegt", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show(this, "Fehler beim erstellen der Datenbank", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!Archivierung_Offen)
            {
                _Archivierung = new f_Archivierung();
                _Archivierung.Show();
                Archivierung_Offen = true;
            }
            else
            {
                _Archivierung.Activate();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (!Auslesen_Offen)
            {
                _Auslesen = new f_Auslesen();
                _Auslesen.Show();
                Auslesen_Offen = true;
            }
            else
            {
                _Auslesen.Activate();
            }
        }
    }
}


Eingabefenster:
PHP:
private void f_Archivierung_FormClosing(object sender, FormClosingEventArgs e)
        {
            f_Hauptmenue _Hauptmenue = new f_Hauptmenue();
            _Hauptmenue.Archivierung_Offen = false;
        }
 
Hallo,

du legst bei FormClosing ein neues f_Hauptmenue-Objekt an, das mit dem Objekt, von dem aus du die Form gestartet hast, nichts zu tun hat.
Du müstest der gestarteten Form entweder eine Referenz auf das f_Hauptmenue-Objekt übergeben oder aber die Status-Variablen (und Get/Set-Methoden) in f_Hauptmenue statisch machen.

Gruß
MCoder
 
Einfach klasse, es hat wunderbar geklappt die Felder und Metoden statisch zu machen. Danke

Ich konnte mir schon denken das die neue Instanziirung mit dem bereits geöffneten Fenster nichts zu tun hat habe diesen gedanken aber nicht weiter verfolgt.

Aber wie geht das mit der übergabe einer Referenz auf das f_Hauptmenue-Objekt? Das klingt irgendwie viel eleganter und cooler.
 
Ein Beispiel für die Referenz:
C#:
// Die Klasse bekommt einen Member und einen Parameter für den Konstruktor
public partial class f_Archivierung : Form 
{
    f_Hauptmenue _Hauptmenue;
    
    ...
    
    public f_Archivierung(f_Hauptmenue hauptmenue)
    {
        _Hauptmenue = hauptmenue;
        
        // ... 
    }

    ...

    private void f_Archivierung_FormClosing(object sender, FormClosingEventArgs e) 
    { 
        _Hauptmenue.Archivierung_Offen = false; 
    }
}

// Der Aufruf erfolgt dann so:
 _Archivierung = new f_Archivierung(this);
Gruß
MCoder
 
Tausend Dank MCoder =)

hast mir wirklich sehr geholfen.

Wenn du mal mein Programm testen willst, ich habs online gestellt (also die setup)
Vielleicht hast du ja noch ein paar coool Ideen die ich aunbauen könnte. (schon einige Herrausforderungen schnuppert)


PS: auch von anderen Testern ist ein Feedback sowie ideen erwünscht
 

Anhänge

  • Debug.zip
    783,1 KB · Aufrufe: 12

Neue Beiträge

Zurück