[C#] Variablenübergabe 2. Form

BlackRose2

Grünschnabel
Hallo liebe Community,

dieses Problem wurde bestimmt schon hunderte male gefragt, aber ich habe damit immer noch meine Probleme.

Mein Problem:
Ich übergebe einer 2. Form eine Variable, diese kommt auch an, aber wenn ich versuche diese Variable direkt nach InitializeComponent() in einer Funktion abrufen möchte, gibt er mir nichts zurück. Wenn ich diese Variable über einen Button ausgeben lasse, kriege ich diese Variable aber angezeigt.

Form1:
Code:
private void textBox7_Enter(object sender, EventArgs e)
        {
            if (textBox7.Text == "")
            {
                Form3 f3 = new Form3();
                f3.frm1 = this;
                f3.wert = "PSA";
                f3.Show();
            }
        }

Form2:
Code:
public partial class Form3 : Form
    {
        private Form1 _frm1;

        public Form3()
        {
            InitializeComponent();
            Optionen();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show(this.wert);
            //this.Close();
        }

        public void button1_Click(object sender, EventArgs e)
        {
            string value = "";

            try
            {
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {
                    if (dr.Cells[0].Value != null) value += dr.Cells[1].Value + ", ";
                    dr.Cells[0].Value = null;
                }

                value = value.Substring(0, value.Length - 2);
                this._frm1.textBox7.Text = value;
            }
            catch
            {
                MessageBox.Show("Es muss mindestens eine Option ausgewählt werden", "Fehler");
            }
        }

//Funktionen

        private void Optionen()
        {
            string text = this.wert;
            MessageBox.Show(text);
            SqlCeConnection conn = new SqlCeConnection("Data Source=Termine.sdf");
            conn.Open();

            try
            {
                SqlCeCommand cmd_greattable = new SqlCeCommand("SELECT " + this.wert + " FROM Werte ORDER BY " + this.wert + " ASC", conn);
                SqlCeDataAdapter adp_greattable = new SqlCeDataAdapter(cmd_greattable);

                DataTable dtbudget0 = new DataTable();

                adp_greattable.Fill(dtbudget0);

                dataGridView1.DataSource = dtbudget0;
                dataGridView1.AutoGenerateColumns = true;
            }

            catch (Exception ex)
            {

                MessageBox.Show(ex.ToString(), "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

            conn.Close();
        }

        public string wert
        {
            get;
            set;
        }

        public Form1 frm1
        {
            set { this._frm1 = value; }
        }
    }

Vielen Dank schon mal im vorraus.

VG
BlackRose2
 
Hallo BlackRose2

Bitte nicht Themen pushen, damit erhöhst du nicht unbedingt, dass man dir hilft und es ist nicht fair den anderen gegenüber.

Zu deinem Problem:
Du verwendest die Variable "wert" in der Funktion Optionen. Diese Funktion wird im Konstruktor von Form3 aufgerufen. Du setzt aber wert erst nach dem Konstruktor, entsprechend ist der dann da auch noch nciht vorhanden.

Grüsse
Cromon
 
Hi

du meinst also, du hast in der ersten Zeile von Optionen noch keinen Wert,
aber in button2_Click schon?

In ersten Codestück weist du dem wert erst nach dem Konstruktor was zu.
Optionen wird aber schon während des Konstruktors aufgerufen.

Übergib den Wert als Parameter zum Konstruktor und speicher das dort in die Klassenvariable um,
bevor du Optionen aufrufst.

PS: Die Antwort wäre vermutlich schneller gekommen,
wenn du im richtigen Unterforum gepostet hättest.
Jetzt ists im Richtigen.
 
Hallo,

erst einmal vielen Dank für die schnelle Antwort und Etschuldigung für das Pushen und das Posten im falschen Forum.

So ich habe das jetzt einmal so geändert:
Code:
        private Form1 _frm1;

        public string Tabelle
        {
            get;
            set;
        }

        public string Root
        {
            get;
            set;
        }

        public string sBox
        {
            get;
            set;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        public Form3()
        {
            InitializeComponent();

            this.Name = Tabelle;

            Optionen(Root, Tabelle);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string value = "";

            try
            {
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {
                    if (dr.Cells[0].Value != null) value += dr.Cells[1].Value + ", ";
                    dr.Cells[0].Value = null;
                }

                value = value.Substring(0, value.Length - 2);

                if (sBox == "Box7") this._frm1.textBox7.Text = value;
                if (sBox == "Box8") this._frm1.textBox8.Text = value;
                if (sBox == "Box9") this._frm1.textBox9.Text = value;
                if (sBox == "Box10") this._frm1.textBox10.Text = value;
                if (sBox == "Box11") this._frm1.textBox11.Text = value;
                if (sBox == "Box12") this._frm1.textBox12.Text = value;
            }
            catch
            {
                MessageBox.Show("Es muss mindestens eine Option ausgewählt werden", "Fehler");
            }
        }

//##########################################################################################
//#################################### Funktionen ##########################################
//##########################################################################################

        private void Optionen(string Pfad, string Table)
        {
            string Path = Pfad;
            string Tab = Table;

            SqlCeConnection conn = new SqlCeConnection("Data Source=" + Path + "Termine.sdf");
            conn.Open();

            try
            {
                SqlCeCommand cmd_greattable = new SqlCeCommand("SELECT '" + Tab + "' FROM Werte", conn); // ORDER BY '" + Tabelle + "' ASC", conn);
                SqlCeDataAdapter adp_greattable = new SqlCeDataAdapter(cmd_greattable);

                DataTable dtbudget0 = new DataTable();

                adp_greattable.Fill(dtbudget0);

                dataGridView1.DataSource = dtbudget0;
                dataGridView1.AutoGenerateColumns = true;
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            conn.Close();
        }

        public Form1 frm1
        {
            set { this._frm1 = value; }
        }

Leider kriege ich diese Variable noch immer nur in einem Button.

VG
BlackRose2
 
C#:
       public Form3()
        {
            InitializeComponent();
 
            this.Name = Tabelle;
 
            Optionen(Root, Tabelle);
        }

Weiterhin, Tabelle und Root haben den Standardwert im Konstruktor da ihnen zu diesem Zeitpunkt nichts zugewiesen ist.
 
Ok,

und wie umgehe ich am besten dieses Problem. Mir fällt gerade nichts ein.

Oder müsste ich einfach nur ein paar leeren Variablen die "richtigen" Variablen zuordnen.
Code:
string var1 = Tabelle;
string var2 = Root;

VG
BlackRose2
 
Zurück