Entwickler-Ecke
Basistechnologien - Generiche Methode mit Delegate? Ich benötige Hilfe :(
dragi - Do 08.01.09 13:40
Titel: Generiche Methode mit Delegate? Ich benötige Hilfe :(
Hallo,
ich habe das Konzept mit den delegates noch nicht verstanden und benötige dringend Hilfe. Vielleicht brauhce ich auch etwas anderes als Delegates?
Hier nun das Problem:
Ich habe eine Formular mit 8 Eingabefeldern und neben jedem Feld einen "Suche" Button. Das Design kann nihct verändert werden, da generiert.
Jeder Button macht ziemlich das gleiche...suche in DB und Wert in einem Objekt speichern.
Wie kann ich das nun so refactorn, das jeder Button die gleiche Methode aufruft aber in der korrekten Objektvariable speichert?
Bsp.:
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:
| internal void SelectAction1(object sender, EventArgs e) { this.GetAndShowFieldData("Spalte1", XXXX); }
internal void SelectAction2(object sender, EventArgs e) { this.GetAndShowFieldData("Spalte2", XXXX); }
internal void SelectAction3(object sender, EventArgs e) { this.GetAndShowFieldData("Spalte3", XXXX); }
private void GetAndShowFieldData(string p, SetDelegate<byte> setTarget) { this.queryParams.Remove(p); IList<String> valueList = UserSelectedQuery(queryParams, p, Group.T_RAD); if (FieldSelectionViewController.Instance.NavigateModal(null, valueList) == DialogResult.OK) { string value = FieldSelectionViewController.Instance.SelectedValue; if (value == string.Empty) return; double temp = Convert.ToDouble(value); this.AddValueToQueryParams(p, value); valueList.Clear(); } valueList = null; } |
Hier sieht man 3 Methoden SelectAction und jede ruft GetAndShowFieldData auf. Das XXXX ist jetzt mein Problem, ich habe ein Object Temp und SelectAction1 soll über GetAndShowFieldData den ermittelten Wert in Temp.Wert1 speichern, SelectAction2 in Temp.Wert2, etc.
Also müsste der Aufruf irgendwie sowas wie this.GetAndShowFieldData("Spalte1", Temp.Wert1) sein. Aber wie mache ich das? Ich verstehe es einfach nicht.
Kann mir hier vielleicht jemand erklären wie ich das machen kann?
Vielen Dank
dragi....der nicht mehr weiter weiß
JüTho - Do 08.01.09 14:10
Tut mir leid, da weiß ich keinen richtigen Rat. Ich kann auch nicht sehen, dass Delegates in diesem Fall helfen. (Meinst Du überhaupt Delegates und nicht vielmehr nur "generisch"? Auch davon sehe ich nur in dem Argument-Typ etwas.)
Mein Vorschlag wäre, einen int-Wert als
Button.Tag zu verwenden: Button1.Tag = 1, Button2.Tag = 2 usw. Den kannst Du über sender abfragen und durch eine switch-Anweisung auswerten:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| internal void SelectActions(object sender, EventArgs e) { if (sender is Control && (sender as Control).Tag is int) { SetDelegate<byte> target = null; string columnName = String.Empty; int current = (int)(sender as Control).Tag; switch(current) { case 1: columnName = "Spalte1"; target = Temp.Wert1; break; } if (! String.IsNullOrEmpty(columnName) && target != null) GetAndShowFieldData(columnName, target); } } |
Das ließe sich noch weiter standardisieren. Theoretisch können die Werte auch über Reflection abgefragt werden; aber das halte ich für zu umständlich.
Wenn ich aber Deine Situation überhaupt nicht richtig verstanden habe, dann solltet Du etwas mehr über die verwendeten Typen (Temp, Wert1 usw.) sagen.
Gruß Jürgen
Th69 - Do 08.01.09 14:20
Du kannst entweder den Delegate benutzen oder aber einfach die Variable mittels "ref" bzw. "out" übergeben.
Beispiel für delegate:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| internal void SelectAction1(object sender, EventArgs e) { this.GetAndShowFieldData("Spalte1", delegate(double val) { temp.Wert1 = val; }); }
private void GetAndShowFieldData(string p, SetDelegate<double> setTarget) <- muß das nicht <double> heißen ??? { if(setTarget != null) setTarget(temp); } |
Beispiel für "out":
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| internal void SelectAction1(object sender, EventArgs e) { this.GetAndShowFieldData("Spalte1", out temp.Wert1); }
private void GetAndShowFieldData(string p, out double val) { val = temp; } |
Schau am besten noch mal in ein C# Buch oder Tutorial, z.B. in das OpenBook
http://openbook.galileocomputing.de/visual_csharp
Kha - Do 08.01.09 15:56
Wobei outbei einer void-Methode einen stutzig machen sollte, denn dann tut es auch direkt return;) .
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!