Laden...

Infos von Fenster A nach Klick in DataGridView von Fenster B geben

Erstellt von icolor vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.337 Views
I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren
Infos von Fenster A nach Klick in DataGridView von Fenster B geben

Moin Leute,
nach Jahren bin ich mal wieder dabei C# zu programmieren. Und hier stosse ich auf erste Probleme.

Ich habe ein Fenster welches eine Datagridview beinhaltet. Und ein weiteres Fenster, in welchem ich Eingaben mache. Mit Klick auf OK sollen diese Eingaben nun in die Datagridview übernommen werden.
Das habe ich so gelöst, das ich bei Klick auf OK eine neue Instanz des Fensters mit dem Grid erzeuge und darin fillGrid als Funktion ausführe.
Wenn ich das alles jetzt so lese was ich schreibe, ist das mit der neuen Instanz wohl total verkehrt und ich muss das Ganze irgendwie triggern, bzw. delegieren.
Kann mir jemand kurz auf die Sprünge helfen, wo ich suchen muss?
Ein paar Stichworte sollten reichen.

Danke.

5.658 Beiträge seit 2006
vor 6 Jahren

Weeks of programming can save you hours of planning

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren

Erst einmal danke für die Antwort. Aber anscheinend stelle ich mich zu doof an. Ich habe versucht das Beispiel für die Events in meinen Code zu verbauen. Aber er feuert keine Events. Also habe ich das Ganze wieder ausgebaut.
Worum es mir geht:


public partial class Packstueck_Erfassen : Form
{
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // Erfassung der Daten im Fenster
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

	private void button3_Click(object sender, EventArgs e)
        {
            DataRow dr = dataSet1.Tables["Packstuecke"].NewRow();
            dr["Anzahl"] = Int16.Parse(this.Anzahl.Text);
            dr["Beschreibung"] = this.Beschreibung.Text;
            dr["Breite"] = Double.Parse(this.Breite.Text);
            dr["Länge"] = Double.Parse(this.Länge.Text);
            dr["Höhe"] = Double.Parse(this.Höhe.Text);
            dr["Farbe"] = this.Farbe;
            dr["noKipp"] = this.noKipp.Checked;
            dr["noDreh"] = this.noDreh.Checked;
            dr["onBottom"] = this.onBottom.Checked;
            dr["Gefahrgut"] = this.Gefahrgut.Checked;
            dataSet1.Tables["Packstuecke"].Rows.Add(dr);

	    // Jetzt soll in Packliste_Step1 das DataGrid gefüllt/aktualisiert werden
	    ...
        }
}

public partial class PackListe_Step1 : Form
{
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // Anzeige der erfassten Daten im Grid	
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

	private void button1_Click(object sender, EventArgs e)
        {
            Packstueck_Erfassen pe = new Packstueck_Erfassen();
            pe.Show();
        }

	protected virtual void fillGrid()
        {
            dataGridView1.Rows.Clear();

            foreach (DataRow dr in dataSet1.Tables["Packstuecke"].Rows)
            {
                DataGridViewRow dgv = new DataGridViewRow();
                DataGridViewTextBoxCell cell1 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell1);
                cell1.Value = dr["Anzahl"];
                DataGridViewTextBoxCell cell2 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell2);
                cell2.Value = dr["Beschreibung"];
                DataGridViewTextBoxCell cell3 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell3);
                cell3.Value = dr["Breite"];
                DataGridViewTextBoxCell cell4 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell4);
                cell4.Value = dr["Höhe"];
                DataGridViewTextBoxCell cell5 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell5);
                cell5.Value = dr["Länge"];
                DataGridViewTextBoxCell cell6 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell6);
                cell6.Value = dr["Gewicht"];

                dataGridView1.Rows.Add(dgv);
                dataGridView1.Update();
                dataGridView1.Refresh();
            }
        }
}

Es gibt das Fenster zum Erfassen und das Fenster zur Anzeige der bereits erfassten Sätze mit Grid. Es soll nun jedes mal, wenn der Button3 Klick in der Erfassung ausgeführt wird, das Grid in der Liste neu gefüllt werden.

Wie gesagt, ich habe versucht Eure Beispiele zu verbauen. Aber es wird kein Event getriggert.

Kann mir ggf. am obrigen Code jemand aufzeigen, wie das genau funktioniert? Ich würdet mir damit sehr helfen.

Übringens existiert der Link zu "PS: Hier noch ein Artikel auf codeproject.com zu dem Thema: Passing Data Between Forms" in Codeprojekt nicht mehr.

1.029 Beiträge seit 2010
vor 6 Jahren

Hi,

anstatt es zu löschen hättest du es lieber posten sollen - so bekommst du nur wieder ein Beispiel wie das funktioniert 😉

Grundsätzlich:
Bitte schau dir DataBinding an - was du dort machst wird nichts als Durcheinander.

Dein Beispiel (jeweils ohne Designer-Code):

  1. Form1

public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();

			var form2 = new Form2();

			// an das ereignis von form 2 dranhängen
			form2.DataAdded += (sender, args) =>
			{
				// wenns ausgelöst wird - irgendwas mit den daten machen
				MessageBox.Show(args.Data.Value1);
			};

			// open Form2 on button-click
			openForm2button.Click += (sender, args) => { form2.Show(); };
		}
	}

  1. Form2:

public partial class Form2 : Form
	{
		public event EventHandler<DataAddedEventArgs<MyDataClass>> DataAdded;
		
		public Form2()
		{
			InitializeComponent();
			addButton.Click += (sender, args) =>
			{
				// daten zusammenstellen
				var data = new MyDataClass
				{
					Value1 = textBox1.Text,
					Value2 = textBox2.Text
				};

				// ereignis auslösen
				OnDataAdded(data);
			};
		}

		// mit dieser methode wird das event ausgelöst
		protected void OnDataAdded(MyDataClass data)
		{
			DataAdded?.Invoke(this, new DataAddedEventArgs<MyDataClass>(data));
		}
	}

  1. Klassen für Event und Daten

// die klasse, die die daten hält
	public class MyDataClass
	{
		public string Value1 { get; set; }
		public string Value2 { get; set; }
	}

	// Klasse, welche über das event "geschickt" wird
	public class DataAddedEventArgs<T> : EventArgs
	{
		public DataAddedEventArgs(T data)
		{
			Data = data;
		}

		public T Data { get; }
	}

LG

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren

Ich versuche das mal umzumünzen auf meine Forms:

Erfassung


 public partial class Packstueck_Erfassen : Form
    {
        public event EventHandler<DataAddedEventArgs<MyDataClass>> DataAdded;

        public Packstueck_Erfassen()
        {
            InitializeComponent();

            addButton.Click += (sender, args) =>
                {
                    var data = new MyDataClass();
                    OnDataAdded(data);
                };
        }

        // mit dieser methode wird das event ausgelöst
        protected void OnDataAdded(MyDataClass data)
        {
            DataAdded?Invoke(this, new DataAddedEventArgs<MyDataClass>(ds));
        }
        private void addButton_Click(object sender, EventArgs e)
        {
            DataRow dr = dataSet1.Tables["Packstuecke"].NewRow();
            dr["Anzahl"] = Int16.Parse(this.Anzahl.Text);
            dr["Beschreibung"] = this.Beschreibung.Text;
            dr["Breite"] = Double.Parse(this.Breite.Text);
            dr["Länge"] = Double.Parse(this.Länge.Text);
            dr["Höhe"] = Double.Parse(this.Höhe.Text);
            dr["Farbe"] = this.Farbe;
            dr["noKipp"] = this.noKipp.Checked;
            dr["noDreh"] = this.noDreh.Checked;
            dr["onBottom"] = this.onBottom.Checked;
            dr["Gefahrgut"] = this.Gefahrgut.Checked;
            dataSet1.Tables["Packstuecke"].Rows.Add(dr);

            OnDataAdded(data);
        }
}

Anzeige Grid


public partial class PackListe_Step1 : Form
    {
        public PackListe_Step1()
        {
            InitializeComponent();

            var Packstueck_Erfassen = new Packstueck_Erfassen();
            // an das ereignis von form 2 dranhängen
            Packstueck_Erfassen.DataAdded += (sender, args) =>
            {
                // wenns ausgelöst wird - irgendwas mit den daten machen
                fillGrid(sender, args);
            };
        }
        public void fillGrid(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();

            foreach (DataRow dr in dataSet1.Tables["Packstuecke"].Rows)
            {
                DataGridViewRow dgv = new DataGridViewRow();
                DataGridViewTextBoxCell cell1 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell1);
                cell1.Value = dr["Anzahl"];
                DataGridViewTextBoxCell cell2 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell2);
                cell2.Value = dr["Beschreibung"];
                DataGridViewTextBoxCell cell3 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell3);
                cell3.Value = dr["Breite"];
                DataGridViewTextBoxCell cell4 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell4);
                cell4.Value = dr["Höhe"];
                DataGridViewTextBoxCell cell5 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell5);
                cell5.Value = dr["Länge"];
                DataGridViewTextBoxCell cell6 = new DataGridViewTextBoxCell();
                dgv.Cells.Add(cell6);
                cell6.Value = dr["Gewicht"];

                dataGridView1.Rows.Add(dgv);
                dataGridView1.Update();
                dataGridView1.Refresh();
            }
        }
}

Klasse für Daten und Events


    public class MyDataClass
    {
        public DataSet Crates { get; set; }
        public DataSet Container { get; set; }
        public DataSet ds { get; set; }
    }

    public class DataAddedEventArgs<T> : EventArgs
    {
        public DataSet Ds { get; set; }

        public DataAddedEventArgs(DataSet ds)
        {
            Ds = ds;
        }
    }

Folgende Probleme:

1.) In der Erfassung ist die Syntax für den Invoke so nicht okay.
2.) Was genau müsste ich jetzt in meiner Form bei addButton_Click im OnDataAdded schreiben?

Die Form Packliste sieht so okay aus.
Sorry wenn ich mich doof anstelle. Ich habe jetzt mehrere Jahre kein C# mehr programmiert und ich merke das mir viel abhanden gekommen ist.

709 Beiträge seit 2008
vor 6 Jahren

Hallo,
zu 1: Nach dem Fragezeichen fehlt ein Punkt (siehe hier beim Punkt "null-conditional operators").

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren

Bei


DataAdded?.Invoke(this, new DataAddedEventArgs<MyDataClass>(ds));

sagt er mit ungültiger Ausdruck "."
Syntaxfehler ":" erwartet

M
33 Beiträge seit 2012
vor 6 Jahren
DataAdded?.Invoke(this, new DataAddedEventArgs<MyDataClass>(ds));

ist die "neue" Kurzschreibweise für ....


var handler = DataAdded;
if(handler!=null)
{
 handler.Invoke(this, new DataAddedEventArgs<MyDataClass>(ds));
}

welche .Net Version peilst du an ?

Falls fallend du vom Dach verschwandest, brems bevor du Unten landest.

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren

.NET Framework 4.5

16.830 Beiträge seit 2008
vor 6 Jahren

Das ist aber kein Framework Feature sondern ein Compiler Feature, das mit Visual Studio 2017 mit kommt.
Die Framework Version ist dabei irrelevant.

T
2.223 Beiträge seit 2008
vor 6 Jahren

@icolor
Das dürfte kein .Net Feature sondern ein Compiler Feature sein.
Welche Entwicklungsumgebung verwendest du?
Würde mal eine neue vorschalgen, wenn dir schon dieses Feature fehlt.
Gibt es seit ca. 2-3 Jahren schon, also dürftest du wohl noch mit VS 2012 arbeiten oder?

Nachtrag:
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-6#null-conditional-operators

Gibt es also schon seit C# 6.0

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

709 Beiträge seit 2008
vor 6 Jahren

Dieses Feature dürfte bereits ab VS2015 vorhanden sein.

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren

Sorry, ja. Ich habe noch 2012.

T
2.223 Beiträge seit 2008
vor 6 Jahren

Entweder musst du dir die aktuelle VS Version ziehen oder einfach die 4 Zeilen selbst programmieren 😃

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

1.029 Beiträge seit 2010
vor 6 Jahren

Hi,

habe noch einige Anmerkungen:

  1. Die Klasse "DataAddedEventArgs" bitte so lassen wie ich sie hatte - das Ding war generisch programmiert und kann auch so mit einem Dataset belegt werden. Google einfach mal "C# Generics" (das geht auch in VS 2012 schon)

  2. Du willst mit Sicherkeit kein komplettes DataSet übertragen - sondern maximal eine DataRow die man einfach hinzufügen kann (würde im Form 2 sogar eine Datenklasse - und nicht eine DataRow verwenden - die DataRow kannst du ja im Event von Form 1 erstellen und hinzufügen)

So implementiert würde sich dir auch erschließen was im AddButton.Click-Ereignis passieren soll - hier sollst du nämlich:
a) Die Daten aus den Textboxen in die Datenklasse packen
b) Das Ereignis mit der Datenklasse auslösen

LG

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren

Dann muss ich noch einmal blöde was fragen. Ich habe das so weit am Laufen, das jetzt das Event gefeuert wird.
Ich komme also im fillGrid (object sender, EventArgs e) an.
Hier ist sender = Packstueck_Erfassen und e = DataAddedEventArgs<MyDataClass>.
So schön, so gut.
e hat die Unterpunkte Data und darunter die einzelnen erfassten Werte.

Wie komme ich jetzt da ran?

Danke nochmal.

1.029 Beiträge seit 2010
vor 6 Jahren

Hi,

du hast doch jetzt selbst schon aufgeschrieben wie du dran kommst 😕

e.Data.<DeinPropertyDassDuImplementierenMusst>

Oder was meinst du?

LG

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren

Danke, aber vielleicht habe ich grade ein Brett vor dem Kopf. Nichts funktioniert.

Ich habe:


e
+ [DataAddedEventArgs<MyDataClass>]
   + base
   + Data
       anzahl
       beschreibung
...

Bei e.Data<MyDataClass> sagt er mir, System.EventArgs enthält keine Definition für Data.

3.003 Beiträge seit 2006
vor 6 Jahren

Auch wenn's von Taipi gut gemeint war: kopier bitte niemals Code, den du nicht verstehst. Nicht hier im Forum, und auch sonst nicht.

Alles Wissen, was du benötigst, steckt in der allerersten Antwort, wenn du dir nur mal die Mühe machst, den Artikel vollständig durchzuarbeiten (und damit ist nicht nur lesen gemeint).

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 6 Jahren

Ahh, ich bin ein Idiot.
fillGrid darf nicht EventArgs haben, sonden DataAddedEventArgs. Dann klappt es auch mit den Nachbarn.

*fg*

T
2.223 Beiträge seit 2008
vor 6 Jahren

@icolor
Hier solltest du dir wirklich angewöhnen Code selbst zu schreiben um solche Probleme zu lösen.
Den Code als Vorlage zu verwenden ist auch hier im Forum nicht immer ratsam, da einige den Code einfach niederschreiben ohne ihn zu testen.

Dies soll dann nur den ungefähren Prozess darstellen ohne fertigen Code zu liefert.
Ist ja schließlich nicht unsere Aufgabe den Code für andere zu schreiben.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.