Entwickler-Ecke

WinForms - Anzeige durch Übergabe Form1 -> Form2 geht nicht


Dhakiyah - Fr 24.10.14 19:03
Titel: Anzeige durch Übergabe Form1 -> Form2 geht nicht
Ich habe in der MainForm folgendes stehen:


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:
55:
56:
57:
58:
59:
60:
61:
62:
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;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class frm_main : Form
    {

        // Variablendeklaration
        private SqlConnection con = new SqlConnection("blablabla...");
        public static String s_artikel;
        public frm_main()
        {
            InitializeComponent();
        }

        private void cmd_neues_Click(object sender, EventArgs e)
        {
            frm_dlg_neue_suche frm = new frm_dlg_neue_suche();
            frm.Show(this);
        }

        public void Anzeigen()
        {
            
            string SQL1 = "select * from A";
            string SQL2 = "select * from B";
            SqlCommand cmd = new SqlCommand(SQL1, con);
            SqlCommand cmd1 = new SqlCommand(SQL2, con);
            SqlDataReader reader1, reader2;

            inp_nr.Text = s_artikel;
            con.Open();
                reader1 = cmd.ExecuteReader(); 
                while (reader1.Read())
                {
                    inp_menge1.Text = reader1["MENGE1"].ToString();
                    inp_menge2.Text = reader1["MENGE2"].ToString();
                }
                reader1.Close();

                reader2 = cmd1.ExecuteReader();
                while (reader2.Read())
                {
                    inp_a.Text = reader2["a1"].ToString() + " " + reader2["a2"].ToString();
                    inp_b.Text = reader2["b"].ToString();
                    inp_c.Text = reader2["c"].ToString();
                    inp_d.Text = reader2["d"].ToString();
                    inp_e.Text = reader2["e"].ToString();
                }
                reader2.Close();
            con.Close();
        }
    }
}


In der zweiten Form will ich durch DoubleClick auf ein DataGridView die ArtikelNr. an die MainForm schicken, damit diese dort angezeigt wird. Die Übergabe der ArtikelNr. funktioniert, aber er zeigt nichts an, obwohl er durch das Anzeigen() durchläuft beim debuggen...

In der zweiten Form steht folgendes:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        private void fg_beschreibung_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            
            frm_main frm_main = new frm_main();
            frm_main.s_artikel = fg_beschreibung.Rows[e.RowIndex].Cells[0].Value.ToString();
            
            frm_main.Anzeigen();
            Close();
        }


Nicht wundern, habe Text rausgelöscht aus den SQL Statements etc.

Die Statements etc. funktionieren einwandfrei!
Wenn ich auf die Form1 beim ButtonClick Anzeigen machen, geht es.
Die ArtikelNr. wird auch übergeben!


Dhakiyah - Fr 24.10.14 19:29

Ablauf ist folgender:
Ich öffne eine Artikelkarte (MainForm).
Danach klicke ich auf "Neue Suche".
Dann öffnet sich ein neues Fenster mit einem SuchenButton, einer Textbox und einem DataViewGrid.
Ich suche dann einen Artikel, das Ergebnis wird in die Tabelle geladen.
Beim Doppelklick auf die Tabelle soll die Artikelnummer an die MainForm übergeben werden (funktioniert).
Gleichzeitig soll das "SuchenFenster" geschlossen werden und in der Artikelkarte wird der Artikel mit seinen Eigenschaften angezeigt.

Nur dieses Anzeigen funktioniert nicht.

Lege ich auf die Main Form einen weiteren Button und hinterlege dort das Anzeigen(), geht es nach betätigen....


Ralf Jansen - Fr 24.10.14 19:48

In deiner fg_beschreibung_CellDoubleClick Methode erzeugtst du ein neues frm_main. Das ist eine andere als die die gerade angezeigt wird.

Sauber wäre wenn du im CellDoubleClick einen Event wirfst denn die originale frm_main fängt und von dort dann die Anzeige aktualisiert. Dann brauch deine 2.te Form auch frm_main nicht kennen und bleibt universell einsetzbar.

Die billige Lösung wäre den übergeben Owner, denn hast du beim Show der Form übergeben, wieder auf die tatsächliche Form zu casten.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private void fg_beschreibung_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
    frm_main tmp = this.Owner as frm_main;
    if(tmp != null)
    {
        tmp.s_artikel = fg_beschreibung.Rows[e.RowIndex].Cells[0].Value.ToString();            
        tmp.Anzeigen();
    }
    Close();
}


PS: Wenn ich mir was wünschen darf bitte das C# Namensschema angewöhnen. Typen in Groß, Methoden in groß, Variablen in klein. Und niemals nicht Unterstriche sondern Dinge in CamelCase bzw. in PascalCase benamsen.


Dhakiyah - Mo 27.10.14 09:29

Moin!
Habe das ganze mal grade ausprobiert...
Jetzt liefert tmp aber NULL zurück... Woran kann das liegen?

Wegen dem Wunsch, ich versuchs mal. :lol:


Dhakiyah - Mo 27.10.14 09:41

Hab´s jetzt so gelöst:

In der Main form stehen folgende Sachen:



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        public static String s_artikel;

        private void cmd_neues_Click(object sender, EventArgs e)
        {
            frm_dlg_neue_suche frm = new frm_dlg_neue_suche();
            frm.ShowDialog();
            Anzeigen();
        }


In der Form2 folgendes:



C#-Quelltext
1:
2:
3:
       frm_main.s_artikel = fg_beschreibung.Rows[e.RowIndex].Cells[0].Value.ToString();

       Close();


Jetzt weiß ich nicht, ob das eine "schöne" Lösung ist...
Was meint ihr?


Th69 - Mo 27.10.14 10:21

Hallo Dhakiyah,

nein, das ist keine schöne Lösung, denn ein aufgerufenes Formular sollte nicht den Aufrufer direkt kennen.

Auch wenn es viel Text ist, aber lies dir mal (in Ruhe) meinen Artikel zur Kommunikation von 2 Forms [http://www.bitel.net/dghm1164/programming/Kommunikation_von_2_Forms.html] (Stichworte: Eigenschaften und Ereignisse) durch.