Autor Beitrag
c7n
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 03.02.09 11:26 
Hallo *,

ich schlage mich jetzt schon ein bisschen mit C# rum, komme aber überhaupt nicht weiter (auch nach 2 Tagen rumgegoogle).

(Beide im gleichen Namespace)

Aufrufende Methode in Klasse Page :
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public partial class Page : UserControl
{
Parser prs1;
private XDocument ser_XMLFile_systems = new XDocument();
prs1 = new Parser("systems.xml",  ser_XMLFile_systems);
}


Aufzurufenden Methoden in Klasse Parser:
ausblenden 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:
public class Parser {
private XDocument in_target;

public Parser (string uri_xml_file, XDocument target)
        {
            
            WebClient wc = new WebClient();
            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            wc.DownloadStringAsync(new Uri(uri_xml_file, UriKind.RelativeOrAbsolute));
            count_instances++;
            target = in_target; // hierzu meine Frage
        }

private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) //ist ein Handler
        {
            //DownloadStringCompleted(this, new EventArgs());
            if (e.Error == null)
            {
                in_target = System.Xml.Linq.XDocument.Parse(e.Result);
            }
            count_instances--;
            if (count_instances == 0) {
                OnAllFilesDownloaded(thisnew EventArgs());
            }
        }
}

Wie bekomme ich jetzt die Referenz in target nach in_target, sodass sich das Objekt, das hinter target steckt durch die Methode wc_DownloadStringCompleted verändert werden kann?

Stichworte, wie Boxing und Unboxing und Regel der OO habe ich schon gehört, finde aber, dass mein Problem in eines dieser Raster fällt...


Zuletzt bearbeitet von c7n am Di 03.02.09 11:50, insgesamt 2-mal bearbeitet
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: Di 03.02.09 11:44 
Hallo und :welcome:

Den Zusammenhang Deiner Klassen und Methoden verstehe ich eigentlich nicht. Aber wenn die private Variable in_target in der Klasse Parser verändert wird und dann "von außen" verwendet werden soll, ist eine Eigenschaft das richtige Verfahren:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
public class Parser {
   public XDocument target {
      get { return in_target; }
   }
}

Gruß Jürgen
c7n Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 03.02.09 12:01 
Wow, das war eine schnelle Reaktionszeit und viele Dank für die Begrüßung.

Ich habe gerade meinen ersten Post nochmal editiert, um ihn vll. etwas deutlicher zu machen:

Also in der Klasse Page wird jeweils eine Instanz von der Klasse Parser aufgerufen (prs1 = new Parser("systems.xml",  ser_XMLFile_systems)).
Ihre Funktion zusammengefasst ist:
1. Die angegebene XML-Datei runterladen
2. Wenn die Datei heruntergeladen wurde: Die XML in das XDocument schreiben, dass in dem Konstruktur als 2. Parameter mitgegeben wurde.

Wichtig ist jetzt, dass mit diesem XDocument nun in der Klasse Page weitergearbeitet wird. Die Klasse Parse hat nur die Aufgabe den Download und das Parsing zu kapseln. Danach dürfte/sollte die Instanz Parser auch wieder sterben dürfen.


Daher weiß ich jetzt nicht, ob Eigenschaft da das richtige wäre ??!?! :-\

Viele Grüße
Christian
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 03.02.09 12:54 
Ich würde das über eine CallBack-Methode machen, die Du einer aufzurufenden Methode übergibst. Du solltest aber das Abrufen dann in eine separate Methode auslagern, weil Du sonst in unschöne Situationen kommen könntest, wenn Du die Daten in dem CallBack-Handler weiter verarbeitest und noch nciht alles erzeugt wurde, was Du brauchst:
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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
public delegate void CallBackHandler(XmlDocument target);
public partial class Page : UserControl
{
Parser prs1;
private XDocument ser_XMLFile_systems = null;
prs1 = new Parser();

public Page()
{
  prs1.GetFile("systems.xml", XmlFileReady);
}

public void XmlFileReady(XmlDocument target)
{
  ser_XMLFile_systems = target;
  //Hier weiter bearbeiten
}

}

public class Parser {
private XDocument in_target;
private CallBackHandler callBackMethod;

public void GetFile (string uri_xml_file, CallBackHandler callBackMethod)
        {
            this.callBackMethod = callBackMethod;
            WebClient wc = new WebClient();
            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            wc.DownloadStringAsync(new Uri(uri_xml_file, UriKind.RelativeOrAbsolute));
            count_instances++;
        }

private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) //ist ein Handler
        {
            //DownloadStringCompleted(this, new EventArgs());
            if (e.Error == null)
            {
                in_target = System.Xml.Linq.XDocument.Parse(e.Result);
                if (callBackHandler != null)
                  callBackHandler(in_target);
            }
            count_instances--;
            if (count_instances == 0) {
                OnAllFilesDownloaded(thisnew EventArgs());
            }
        }
}

Dann kannst Du Dir auch die Initialisierung sparen und die Übergabe einer Variablen. Hab das jetzt so ohne Syntax-Prüfung hingemalt, also ohne Garantie, dass es auf Anhieb funktioniert. Hoffe auch, dass ich Dein Problem richtig verstanden hab ;)