Autor Beitrag
dragi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 88



BeitragVerfasst: Do 08.01.09 13:40 
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.:
ausblenden volle Höhe 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);
      // Hier muss nun XXXX gesetzt werden????
      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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
//  einheitlich für alle diese Buttons
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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; }); // Benutzung einer anonymen delegate-Methode (ab .NET bzw. C# 2.0)
}

private void GetAndShowFieldData(string p, SetDelegate<double> setTarget)  <- muß das nicht <double> heißen ???
{
    // ...
    if(setTarget != null)
         setTarget(temp);
}


Beispiel für "out":
ausblenden 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; // Zuweisung an out-Variable
}


Schau am besten noch mal in ein C# Buch oder Tutorial, z.B. in das OpenBook openbook.galileocomputing.de/visual_csharp
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 08.01.09 15:56 
Wobei outbei einer void-Methode einen stutzig machen sollte, denn dann tut es auch direkt return;) .

_________________
>λ=