Benutzer mit den meisten Antworten
in einer Statischen Methode eine "normale" Methode aufrufen

Frage
-
Hallo,
ich habe in meinem Programm einen kleinen Fehler. Mein Fehler liegt darin, dass eine statische Methode keine "normale" aufrufen kann.
public static void fillList(string keyword) { int d; d = 0; List<string> channellist = new List<string>(); channellist.Add("Das Erste"); channellist.Add("Einsfestival"); channellist.Add("EinsPlus"); channellist.Add("hr-fernsehen"); channellist.Add("KiKA"); channellist.Add("MDR S-Anhalt"); channellist.Add("MDR Sachsen"); channellist.Add("MDR Thüringen"); channellist.Add("NDR FS HH"); channellist.Add("NDR FS MV"); channellist.Add("NDR FS NS"); channellist.Add("NDR FS SH"); channellist.Add("Phoenix"); channellist.Add("Radio Bremen TV"); channellist.Add("rbb Berlin"); channellist.Add("rbb Brandenburg"); channellist.Add("SR Fernsehen"); channellist.Add("SWR BW"); channellist.Add("SWR RP"); channellist.Add("tagesschau24"); channellist.Add("WDR Fernsehen"); channellist.Add("ZDF"); channellist.Add("ZDFinfo"); channellist.Add("ZDFkultur"); channellist.Add("ZDFneo"); for (int i = 0; i <= channellist.Count; i++) { if (channellist[i].Contains(keyword) == true) { d = d + 1; if (d == 1) { slideTile1(); } if (d == 2) { slideTile2(); } if (d == 3) { slideTile3(); } if (d == 4) { slideTile4(); } if (d == 5) { slideTile5(); } if (d == 6) { slideTile6(); } if (d == 7) { slideTile7(); } if (d == 8) { slideTile8(); } if (d == 9) { slideTile9(); } else break; } } }
//SLIDE IN public void slideTile1() { Tile1.Visibility = Visibility.Visible; SlideTransition slideTransition = new SlideTransition { Mode = SlideTransitionMode.SlideDownFadeIn }; ITransition transition = slideTransition.GetTransition(Tile1); transition.Completed += delegate { transition.Stop(); }; transition.Begin(); }
Wieso?
Als erste Lösung habe ich die 2te Methode auch in eine statische umgewandelt, jedoch kennt diese keine Elemente aus der xml datei mehr.
Fehler:
Für das nicht statische Feld, die Methode oder die Eigenschaft "dontwatchtwice.channelsearch.Tile1" ist ein Objectverweis erforderlich.
Die statische Methode muss doch statisch sein um sie global aufrufbar zumachen. Oder?
LG Elias
Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cf
- Bearbeitet ADL Solutions Sonntag, 25. Mai 2014 07:38
Antworten
-
Ok. Dann zieh die Liste der Kanäle als separate Angelegenheit in ein Repository. Das kannst du meinetwegen statisch gestalten und aus deinem UserControl holst du dir die Liste aller Kanäle und arbeitest _innerhalb_ der Instanz vom UserControl mit der erzeugten Liste der Kanäle.
So in etwa:
public static class ChannelRepository { public static List<string> AllChannels() { var result = new List<string>(); result.Add("Das Erste"); result.Add("ZDF"); ... return result; } } public partial class ChannelSearch : UserControl { public void SucheNachKeyWord(string keyword) { List<string> channels = ChannelRepository.AllChannels(); // hier jetzt deine Schleife über alle Channels und check auf deine Bedingung, ob der channel angezeigt wird oder nicht } }
Jetzt interessiert dein UserControl auch überhaupt nicht mehr, wenn du z.B. die Datenhaltung der Kanäle einmal ändern solltest. So lange das Interface einers ChannelRepository sich nicht ändert. So kannst du die Kanöle z.B. aus einer XML-Datei einlesen oder aus einer Datenbank oder von einem Webservice holen (asynchron!) oder ...
Du siehst hoffentlich, worauf ich hinaus möchte. Trenne die Belange in deiner Anwendung in separate Komponenten / Klassen auf. Stichwort Separation of Concerns.
Dann kannst du den einen Belang, das Liefern einer Kanalliste auch gern als statische Klasse / Methode implementieren.
Hoffe, der Ansatz hilft dir weiter und verwirrt nicht allzu sehr :)
Andreas Richter
Softwareentwickler
http://www.anrichter.net- Als Antwort markiert ADL Solutions Sonntag, 25. Mai 2014 11:27
Alle Antworten
-
Hi,
vereinfacht kannst Du Dir vorstellen, dass bei der Nutzung von statischen Methoden es nur eine Instanz gibt, die beim Start des Programmes nur einmalig angelegt wird und anstelle über eine Verweisvariable direkt über den Klassennamen angesprochen wird.Im Gegensatz dazu gibt es Objekte als Instanzen von Klassen mit nicht-statischen Methoden. Wenn Du auf deren Innereien zugreifen willst, musst Du IMMER genau das gewünschte Objekt adressieren. Dazu wird die Verweisvariable genutzt.
Aus einer nicht-statischen Methode kannst Du immer auf eine statische Methode zugreifen. Dazu brauchts Du keinen Verweis, da es nur ein "statisches Objekt" gibt, was immer da ist und nur über den Klassennamen adressiert wird, vorausgesetzt natürlich, die Berechtigung passt (Zugriffsmodifizierer).
Wenn Du jetzt eine nicht-statische Methode global aufrufbar machen willst, musst Du trotzdem wissen, in welchem Objekt diese Methode aufgerufen werden soll. So etwas kann man organisieren, indem man eine statische Eigenschaft erstellt, die "global" genutzt werden kann. Im Getter der Eigenschaft wird dann das konkrete Objekt genutzt bzw. bereitgestellt.
Vielleicht beschreibst Du etwas genauer, was Du erreichen willst. Es gibt oft mehrere Lösungswege.
--
Peter -
Hallo Peter,
danke für deine schnelle Antwort. Mein Problem besteht darin das ich eine nicht statische Methode in einer Statischen Methode aufrufen möchte. Nur dann bekomme ich den oben genannten Fehler.
Jetzt habe ich mir überlegt ob es eine andere Möglichkeit gäbe eine Methode, in meinem Fall fillList, global zu deklarieren oder wie kann ich den Fehler mit dem Objectverweis für xml Elemente beheben.
LG Elias
Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cf
-
Hallo Elias,
warum hast du denn deine Methode fillList statisch gemacht? Was war die Idee dahinter?
Es macht natürlich Sinn, das stetig gleiche Befüllen einer Liste in eine statische Methode zu packen, da du in der Methode selber keinerlei Zustand benötigst, aber dann würde ich das Füllen und das spätere Anpassen der Oberfläche durch Aufruf deiner Instanz-Methoden trennen. Es sind ja zwei unterschiedliche Belange.
In etwa so:
public static List<string> CreateProgramList(string keyword) public void UpdateTiles(List<string> programList); var programListe = CreateList(string keyword); this.UpdateTiles(programList);
Wäre noch schön, wenn du uns den Aufrufenden Code zeigen könntest und ob der in einer statischen oder instantiierten Methode lebt.Andreas Richter
Softwareentwickler
http://www.anrichter.net -
Hallo,
ich habe die Methode fillList statisch gemacht damit ich von einer anderen cs Datei darauf zugreifen kann. Der aufzurufende Code ist der 2te Code den ich oben gepostet habe.
Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cf
-
Hi,
aus Deinen Codeschnipseln kann man nur raten.Ich vermute, dass sich SlideTile1 bis 9 als nicht statische Methoden in Klassen befinden, die impliziert instanziiert werden oder vielleicht noch nicht instaziiert wurden. Wenn Du aus der statischen Klasse FillList auf die Methoden in den Objekten zugreifen willst, dann musst Du Dir die Objektverweise besorgen. Für SlideTeil1 wäre das der Verweis auf das Objekt, in welchem sich SlideTile1 befindet.
Du müsstest Dir mal die Klassenansicht anschauen und hier beschreiben, damit man verstehen kann, was Du hast. Dann solltest Du beschreiben, was Du erreichen willst. In welchem Objekt willst Du SlideTile1 aufrufen? Gibt es solch ein Objekt überhaupt? Vielleicht muss das Objekt vorher instanziiert werden?
--
Peter -
Hallo,
ich habe bis jetzt nur eine Transition eingebaut. Später soll noch Text und Bilder geändert werden.
Ja, deine Vermutung war richtig.
LG Elias
Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cfJa
- Bearbeitet ADL Solutions Sonntag, 25. Mai 2014 08:43
-
Den Code habe ich gesehen, was mich interessiert ist die Stelle, an der du fillList aufrufst.
Für mich sieht das nach einem CodeBehind hinter eine XAML- oder WinForms-View aus, weil du in deiner slideTile-Methode auf ein Element die Visibility-Eigenschaft setzt.
Wenn dem so ist, dann solltest du die slideTile-Methoden in deinen Code-Behind packen und fillList wirklich nur die Liste erzeugen, füllen und als Rückgabewert liefern lassen. Dann kannst du aus deinem CodeBehind dir über den statischen Aufruf deine Senderliste erzeugen lassen und anschließend die visuellen Elemente, die ja logisch gesehen zur View und nicht zur Senderliste gehören, anhand der gelieferten Liste bearbeiten.
Dass aber eben _nicht_ in der statischen Methode, sondern in der Methode, die die statische aufruft.Ich denke, du hast einen Denkfehler im Code-Design deiner Anwendung. Um dass aber eindeutig beurteilen zu können, fehlt etwas mehr Kontext.
Andreas Richter
Softwareentwickler
http://www.anrichter.net -
Hallo,
der ganze Code findet in einem extra User Control statt. Deshalb auch eine Visibility Eigenschaft.
Ich habe eine Möglichkeit gefunden, um eine nicht statisches Methode in eine statischen Methode aufzurufen. Nur es funktioniert nicht.
public class MyClass { private void data1() { } private static void data2() { MyClass c = new MyClass(); c.data1(); } }
Nur dort bekomme ich auch einen Fehler.
Auf einen nicht statischen Member des äußeren Typs "dontwatchtwice.channelsearch" kann nicht über den geschalteten Typ "dontwatchtwice.channelname.MyClass" zugegriffen werden.
Daruf hin habe ich einfach das ganze mit der
public partial class channelsearch : UserControl
versucht. Ein Fehler trat nicht mehr auf aber wenn ich dann eine Methode aufrufe ruft er sie zwar auf füht den Code aber nicht aus.
LG Elias
Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cf
-
Ok, vergessen wir für einen Moment, statisch und nicht statisch und lass uns den Sachverhalt klären, denn ich denke, du verrenst dich gerade in deiner Klassenstruktur.
Ich versuch mal zusammenzufassen, was ich bisher rausgelesen habe:
Du möchtest ein UserControl bauen, was dir zu einem Suchwort eine Senderliste darstellt. Dazu füllst du die Liste anhand des Suchwortes mit einer Reihe von Sendern. Jeder Sender, der in der Liste enthalten ist, möchtest du nun als ein Tile darstellen.
Hab ich das soweit richtig verstanden?
Andreas Richter
Softwareentwickler
http://www.anrichter.net -
Ja.
Wenn es dann funktionieren sollte, füge ich noch ein paar andere Werte hinzu aber das ist erstmal nebensächlich.
Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cf
-
Ok. Dann zieh die Liste der Kanäle als separate Angelegenheit in ein Repository. Das kannst du meinetwegen statisch gestalten und aus deinem UserControl holst du dir die Liste aller Kanäle und arbeitest _innerhalb_ der Instanz vom UserControl mit der erzeugten Liste der Kanäle.
So in etwa:
public static class ChannelRepository { public static List<string> AllChannels() { var result = new List<string>(); result.Add("Das Erste"); result.Add("ZDF"); ... return result; } } public partial class ChannelSearch : UserControl { public void SucheNachKeyWord(string keyword) { List<string> channels = ChannelRepository.AllChannels(); // hier jetzt deine Schleife über alle Channels und check auf deine Bedingung, ob der channel angezeigt wird oder nicht } }
Jetzt interessiert dein UserControl auch überhaupt nicht mehr, wenn du z.B. die Datenhaltung der Kanäle einmal ändern solltest. So lange das Interface einers ChannelRepository sich nicht ändert. So kannst du die Kanöle z.B. aus einer XML-Datei einlesen oder aus einer Datenbank oder von einem Webservice holen (asynchron!) oder ...
Du siehst hoffentlich, worauf ich hinaus möchte. Trenne die Belange in deiner Anwendung in separate Komponenten / Klassen auf. Stichwort Separation of Concerns.
Dann kannst du den einen Belang, das Liefern einer Kanalliste auch gern als statische Klasse / Methode implementieren.
Hoffe, der Ansatz hilft dir weiter und verwirrt nicht allzu sehr :)
Andreas Richter
Softwareentwickler
http://www.anrichter.net- Als Antwort markiert ADL Solutions Sonntag, 25. Mai 2014 11:27