Benutzer mit den meisten Antworten
Event mehreren Variablen zuweisen

Frage
-
Hallo ich möchte gerne um nicht so viele Übergabeparameter einer Methode übergeben Zu müssen die gewünschte Referenz einer Variablen durch ein Event in die verarbeitende klasse holen. Habe jetzt ein Event namens _holeArtikel. In der aufrufenden klasse wird dieses Event dann verarbeitet und weist die Referenz der Artikel zu. Wenn ich nun aber verschiedene Artikel holen will und dass in der Verarbeitenden Klasse angeben will, muss ich da einzelne Events erstellen, oder kann ich in den EventArgs einfach auch bspw. Ein Integer Wert übergeben, welche Daten gewollt sind und dann in der aufrufenden klasse mit Switch Case entscheiden, welche Daten ich zuweise? Oder wie macht man sowas? Also wenn ich ja in der aufrufenden klasse dem Event eine Methode zuweise, dann führt er ja immer diese aus. Deswegen wollte ich in dieser das Case machen. Oder habt ihr bessere Vorschläge?
Antworten
-
Jetzt macht das so langsam Sinn ;)
Trotzdem gibt es nach meinem Wissen noch 2 geeignete Wege für 2 Situationen.
1. Situation: Ein modales Dialogfeld, welches Daten beim Schließen an die aufrufende Form übermittelt.
Hierfür definierst du eine Eigenschaft in der ChildForm, welche von außen nur gelesen werden kann. Dieser weißt du beim schließen der Form einen Wert zu, genauso wie der DialogResult-Eigenschaft.//Aufruf der 2. Form mit späterer Verarbeitung der Benutzereingabe durch anzeige in einer MsgBox private void buttonShowModalCF_Click(object sender, EventArgs e) { ModalChildForm frm = new ModalChildForm(); if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK) MessageBox.Show(frm.ResultData); } //ChildForm mit Eingabefeld, OK- und Abbrechenbutton public partial class ModalChildForm : Form { public ChildForm() { InitializeComponent(); } public string ResultData { get; private set; } private void buttonOK_Click(object sender, EventArgs e) { DialogResult = System.Windows.Forms.DialogResult.OK; ResultData = textBoxResult.Text; Close(); } private void buttonCancel_Click(object sender, EventArgs e) { DialogResult = System.Windows.Forms.DialogResult.Cancel; Close(); } }
2. Situation: Ein nicht mdales Dialogfeld welches bei einer Änderung des Wertes die Daten neu an die aufrufende Form übermittelt.
Dazu eignet sich ein Event. Hier der Beipielcode dazu://Aus der Form1.cs NonModalChildForm frm = null; private void buttonShowNonModalCF_Click(object sender, EventArgs e) { if(frm ==null || frm.Visible ==false) { frm = new NonModalChildForm(); frm.DataChanged += frm_DataChanged;//Event abbonnieren frm.Show(); } } void frm_DataChanged(object sender, MyEventArgs e) { MessageBox.Show(e.ResultData);//Ausgabe in MsgBox } //Die nicht-modale Form: public partial class NonModalChildForm : Form { public NonModalChildForm() { InitializeComponent(); } private void Apply_Click(object sender, EventArgs e) { var v = DataChanged; if (v != null) v(this, new MyEventArgs(textBoxResult.Text)); } public event EventHandler<MyEventArgs> DataChanged; private void buttonClose_Click(object sender, EventArgs e) { Close(); } }
So und jetzt noch das ganze als Lauffähiges Beipiel: http://sdrv.ms/ZCyggX
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.- Als Antwort markiert Bensen83 Freitag, 5. April 2013 17:07
Alle Antworten
-
Also wenn du in Form1 auf Datenänderungen in Form2 reagieren willst, dann macht sich ein Event am besten. wenn du dagegen an einem x-beliebigem Zeitpunkt die Daten abrufen möchtest, dann würde ich auch Eigenschaften/Methoden zurück greifen.
Kannst du vielleicht etwas Code der beiden Forms posten um dein Vorhaben etwas zu verdeutlichen?
Wichtig wären die Daten/Events die den Datenaustausch betreffen.<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier. -
Also ich habe eine Generische Liste der Artikel. Nun möchte ich eine zweite Form aufrufen, welcher ich verschiedene generische Listen übergebe. Um nun nicht so viele Übergabeparameter eingeben zu müssen, dachte ich mir, Dass ich einfach ein Event erstelle, welches sich die Referenz der Listen holt ( oder die liste holt und später wieder zurückschreibt, da ich die Daten verändern will). Hatte dann gedacht, dass ich in den EventArgs einen String listenname Einträge und dann diesen String in der Hauptfilm Abfrage und entsprechend die liste zurückgebe. Ps. Ob ich jetzt nach ner id suche oder Case mache kommt sich auf das gleiche raus, oder? Ich könnte natürlich auch der liste noch eine Variable Namen spendieren, oder so. Ist es verständlicher geworden? Code kann ich leider nicht rein setzen?, weil es noch keinen gibt. 😉
Ps. Es geht auch darum, bspw. Textboxen in Form1 auf einer Klasse heraus zu beschreiben. Oder comboboxen zu verändern. Würdet ihr da die komplette comboboxen über ein Event in die Klasse holen und später wieder über ein weiteres Event zurückgeben, oder würdet ihr für items.clear und Items.add usw einzelne Events erstellen? Kann ich mir eigentlich auch Referenzen rein holen? Dann müsste das Event einen rückgabewert. Ref Type haben, oder? Also bspw. Public ref combobox comboholenHandler(...) ???? Geht das?- Bearbeitet Bensen83 Mittwoch, 3. April 2013 19:32
-
Nagut, ich habe da eine kleine Idee, diese ist jedoch bin ich mir noch nicht so ganz sicher ob ich dein Anliegen verstanden habe.
Wenn du in Form2 eine Liste aus Form1 bearbeiten willst, dann kannst du diese bspws. direkt im Konstruktor an Form2 übergeben. Wenn du nur ein bestimmtes Item editieren willst, dann brauchst du natürlich nur dieses übergeben. Wenn es sich um nicht einen Klassentyp handelt, dann musst du einen Verweis übergeben.
Was für mich besonders verwirrend an deiner Beschreibung ist, in Form1 hast du eine Liste, Form2 braucht aber mehrere...wo kommen die Anderen her?
Wo du dir Programmierarbeit sparen willst, verstehe ich aber nach wie vor nicht.Wenn du eine Liste hast, dann hast du doch etwas Code, oder?
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier. -
Ok Sorry. Also ich bekomme es jetzt nicht ganz erklärt. Vergessen wir einfach mal die Sache mit den Artikeln. Gehen wir einfach mal davon aus es handle sich um comboboxen einer Form, Welche ich aus der klasse heraus verändern will.
Sollte man diese als ref übergeben, oder doch vielleicht mit einem Event verändern. Wenn Event, dann komplett einlesen? Oder für jede Aktion ein eigenes Event erzeugen? Und wie zuweisen, welche combobox gemeint ist? Also so dass natürlich so wenig wie möglich Events habe.- Bearbeitet Bensen83 Mittwoch, 3. April 2013 20:09
-
Hi. Also ich Versuchs mal 😀😉 Ich möchte gerne auf einer Unterklasse heraus den Inhalt (die Times der Box) bearbeiten, da. Löschen und auch welche hinzufügen. Dann auch das aktuelle Time Auslesen usw. Dies aber nicht nach nem selectedindexchange Event, sonder irgendwann. Dazu muss ich ja doch aus der Unterklasse irgendwie auf die aufrufende Form zurück kommen, das mache ich doch mit Events, oder etwa nicht?
-
Ok, eine Frage vorne weg, was sind "Times"?
Wenn "Times" deine generische Liste ist, und du aus der ChildForm auf die Liste aus Form1 zugreifen willst, dann brauchst du Sie nur an die Childform mit zu übergeben. (Siehe Beipielcode)
Alternativ kannst du auch die Instanz der 1. Form an die ChildForm übergeben.Events eignen sich nur wenn du Form1 über irgendetwas aus ChildForm benachichtigen willst. Aber das ChildForm ja etwas von Form1 haben will und nicht Form1 benachichtuiegn möchte, eignen sich Events nicht.
//Form1 public partial class Form1 : Form { public Form1() { InitializeComponent(); } List<string> MeineListe = new List<string>(); //2. Form aufrufen private void button1_Click(object sender, EventArgs e) { Form2 frm = new Form2(MeineListe); frm.ShowDialog(); } } //ChildForm public partial class Form2 : Form { public Form2(List<string> MeineListe) { InitializeComponent(); this.MeineListe = MeineListe; } List<string> MeineListe = null; //Bearbeiten der Liste private void button1_Click(object sender, EventArgs e) { } }
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier. -
Also erst mal muss ich mich entschuldigen, da ich ja anscheinend total scheiße meine Anliegen schildere. Ich verstehe sie zwar, wenn ich sie lese, aber ich habe sie ja auch geschrieben. 😉 Also nochmal, vergesst die generische liste. Ok. ??!!!? 😉 Ich möchte nur auch eines Unterklasse etwas zurückgeben, um in der Hauptforderung diverse Objekte zu verändern. ( die oben geschriebenen "Times" waren nur ein Fehler der Autovervollständigung und sollten "items" heißen. 😉 Hatte halt mal von nem Informatiker gehört, dass solche Eingriffe auf die Objekte der Hauptform über Events eleganter sind, als durch übergaben mit dem Merkmal ref. Oder was meint ihr?
-
Jetzt macht das so langsam Sinn ;)
Trotzdem gibt es nach meinem Wissen noch 2 geeignete Wege für 2 Situationen.
1. Situation: Ein modales Dialogfeld, welches Daten beim Schließen an die aufrufende Form übermittelt.
Hierfür definierst du eine Eigenschaft in der ChildForm, welche von außen nur gelesen werden kann. Dieser weißt du beim schließen der Form einen Wert zu, genauso wie der DialogResult-Eigenschaft.//Aufruf der 2. Form mit späterer Verarbeitung der Benutzereingabe durch anzeige in einer MsgBox private void buttonShowModalCF_Click(object sender, EventArgs e) { ModalChildForm frm = new ModalChildForm(); if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK) MessageBox.Show(frm.ResultData); } //ChildForm mit Eingabefeld, OK- und Abbrechenbutton public partial class ModalChildForm : Form { public ChildForm() { InitializeComponent(); } public string ResultData { get; private set; } private void buttonOK_Click(object sender, EventArgs e) { DialogResult = System.Windows.Forms.DialogResult.OK; ResultData = textBoxResult.Text; Close(); } private void buttonCancel_Click(object sender, EventArgs e) { DialogResult = System.Windows.Forms.DialogResult.Cancel; Close(); } }
2. Situation: Ein nicht mdales Dialogfeld welches bei einer Änderung des Wertes die Daten neu an die aufrufende Form übermittelt.
Dazu eignet sich ein Event. Hier der Beipielcode dazu://Aus der Form1.cs NonModalChildForm frm = null; private void buttonShowNonModalCF_Click(object sender, EventArgs e) { if(frm ==null || frm.Visible ==false) { frm = new NonModalChildForm(); frm.DataChanged += frm_DataChanged;//Event abbonnieren frm.Show(); } } void frm_DataChanged(object sender, MyEventArgs e) { MessageBox.Show(e.ResultData);//Ausgabe in MsgBox } //Die nicht-modale Form: public partial class NonModalChildForm : Form { public NonModalChildForm() { InitializeComponent(); } private void Apply_Click(object sender, EventArgs e) { var v = DataChanged; if (v != null) v(this, new MyEventArgs(textBoxResult.Text)); } public event EventHandler<MyEventArgs> DataChanged; private void buttonClose_Click(object sender, EventArgs e) { Close(); } }
So und jetzt noch das ganze als Lauffähiges Beipiel: http://sdrv.ms/ZCyggX
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.- Als Antwort markiert Bensen83 Freitag, 5. April 2013 17:07
-
Wenn du Daten von Form1 in die ChildForm geben willst, dann kannst du diese am besten dem Konstruktor mitgeben. Beipiel:
public partial class ChildForm : Form { public ChildForm(string daten) { InitializeComponent(); this.Daten = daten; } private string Daten = ""; } public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void buttonShowChildForm_Click(object sender, EventArgs e) { ChildForm cf = new ChildForm("Meine Daten"); cf.ShowDialog(); } }
Alternativ kannst du die Daten auch einer Eigenschaft in ChildForm zuweisen, und danach die Form aufrufen.
Events sind wie bereits in einem anderen Post gesagt ungeeignet. Diese sind nur für die andere Richtung der Datenübertragung da, und auch nur dann wenn man den Zeitpunkt der Datenänderung nicht kennt.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.