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.
Weeks of programming can save you hours of planning
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.
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):
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(); };
}
}
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));
}
}
// 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
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.
Bei
DataAdded?.Invoke(this, new DataAddedEventArgs<MyDataClass>(ds));
sagt er mit ungültiger Ausdruck "."
Syntaxfehler ":" erwartet
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.
Das ist aber kein Framework Feature sondern ein Compiler Feature, das mit Visual Studio 2017 mit kommt.
Die Framework Version ist dabei irrelevant.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@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.
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.
Hi,
habe noch einige Anmerkungen:
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)
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
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.
Hi,
du hast doch jetzt selbst schon aufgeschrieben wie du dran kommst 😕
e.Data.<DeinPropertyDassDuImplementierenMusst>
Oder was meinst du?
LG
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.
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)
Ahh, ich bin ein Idiot.
fillGrid darf nicht EventArgs haben, sonden DataAddedEventArgs. Dann klappt es auch mit den Nachbarn.
*fg*
@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.