Mentator Geschrieben 21. April 2010 Geschrieben 21. April 2010 Hallo meine Mitleidenden Genossen , Ich habe wieder ein Problem, bei dem mich nicht nur mein Chef sondern auch Microsoft s(chw)itzen lässt. Folgender Sachverhalt: Ich konstruiere eine neue Webseite für meine Firma mittels Silverlight (natürlich auch ein HTML-Ersatz parallel). Nun ist mein Chef weder in der Lage noch hat er Lust dazu bei etwaigen Veränderungen in Zukunft im Quellcode rum zu wurschteln. Also lies ich mir einfallen sämtliche Inhalte als Bilder ein zu binden und diese simultan für beide Bereiche (SL und HTML) zu nutzen, da er diese ohne weiteres Bearbeiten kann. Das klappt auch soweit super. Und die Seite hat mittlerweile echt an Form gewonnen [schulterklopf - Da ich IT-Systemelektroniker bin und hier was anderes machen sollte als zu proggen ] Nu kam er aber auf die glorreiche Idee selbst die Seiten mit denen wir uns Verlinken wollen nicht allzu kompliziert in einer txt Datei zu verewigen um diese dann nach belieben zu bearbeiten. Leider kann mir weder Google, noch Microsoft selbst bisher eine antwort geben wie ich mit der abgespeckkten SL-Version von C# eine .txt Datei öffnen kann. Die bisherigen/und zugegeben einfachen Beispiele von MS haben nixgebracht. private void linkvergabe() { try { using (StreamReader files = new StreamReader("Partner-Links.txt")) { string line; if ((line = files.ReadLine()) != null) { Pl1.NavigateUri = new Uri(line); } } } catch(Exception e) { Console.WriteLine("Es trat ein Fehler bei der Linkvergabe auf"); Console.WriteLine(e.Message); } } Die Linkvergabe im If funzt ohne Probleme. Bei seperater Eingabe der URL wir diese übernommen, das auslesen dieser Zeilen aus ein Txt ist aber für mich eine echt harte nuss. Würde mich freuen wenn ihr mir weiter helfen könntet. Falls ich was vergessen habe, bitte ich um entschuldigung und fragt einfach nach. Vielen Dank schonmal im vorraus Zitieren
chrixko Geschrieben 21. April 2010 Geschrieben 21. April 2010 Der Silverlight(-Client) ist clientseitig. Und so wie das aussieht, möchtest du auf eine Datei die auf dem Server liegt zugreifen. Das geht ohne weiteres nicht. Dazu musst der Server die Datei über eine bestimmte Schnittstelle bereitstellen. Das könntest du zum Beispiel über Webclient, Webservice oder WCF lösen. Andernfalls könntest du die Datei auch vom Client aus hochladen, indem du ein Fileupload-Control zur Verfügung stellst. Dieses Control sollte aber natürlich nur für "Admins" verfügbar sein. Zitieren
Mentator Geschrieben 21. April 2010 Autor Geschrieben 21. April 2010 (bearbeitet) Na klar, sorry aber da sieht man den Wald vor lauter bäumen nicht. Die Frage ist jetzt nur wie benutze ich den Webclient. mit sowas war ich bisher noch nicht konfrontiert worden. EDIT: Ok, ok habe schon was passenden gefunden. http://dotnet-gui.com/forums/p/566/2445.aspx Nur leider funzt das ganze lediglich wenn ich nur eine einzige adresse in der txt. habe. ich hatte zumindest vor die adressen je zeile dort rein zu schreiben. Er liest ja aber das ganze dokument und nicht nur eine zeile! Jemand eine Idee wie ich die einzelnen Zeilen lese? Bearbeitet 21. April 2010 von Mentator Zitieren
Gateway_man Geschrieben 21. April 2010 Geschrieben 21. April 2010 (bearbeitet) StreamReader wr = new StreamReader("Pfad"); using (wr) { while (!(wr.EndOfStream == true)) { string line = wr.ReadLine(); } } wr.close(); Bearbeitet 21. April 2010 von Gateway_man Zitieren
Mentator Geschrieben 21. April 2010 Autor Geschrieben 21. April 2010 Es wäre ja so schön wenn das so einfach gehen würde. Doch leider bekomme ich immer fehlermeldungen wenn ich streamreader in meinem projekt anwenden will. Ich denke mal das liegt an dem zurechtgestutzten c# Befehlen, denn nicht alle die man kennt stehen in einem Silverlight Projekt zur Verfügung. Zitieren
Mentator Geschrieben 21. April 2010 Autor Geschrieben 21. April 2010 //auslesen und Vergabe von Linkadressen der Partner private void linkvergabe() { WebClient webClient = new WebClient(); webClient.DownloadStringCompleted += WebClientDownloadStringCompleted; webClient.DownloadStringAsync(new Uri("adresse", UriKind.Relative)); } private void WebClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error == null) { Pl1.NavigateUri = new Uri(e.Result); } else MessageBox.Show(e.Error.Message); } So weit so gut, aber wie bekomme ich nun aus dem e.Result mehrere einzelne Werte, denn so ist der komplette Dateiinhalt als ein string zu verarbeiten , wenn ich das richtig verstehe. PS: Editieren war nciht möglich! Warum? keine ahnung Zitieren
Gateway_man Geschrieben 21. April 2010 Geschrieben 21. April 2010 (bearbeitet) Und warum versteifst du dich jetzt auf das Zeilenprinzip. Mach doch einfach folgendes: Nach jedem Link fügst du ein Zeichen ein, welches mit höchster Wahrscheinlichkeit in keinem Link vorkommt. (Beispielsweise Tilde (~)) Und ließt dann den gesamten Text in einen String und benutzt dann die String Split funktion? Lg Gateway PS: (wenn du den Code 1 zu 1 kopiert hast, hast du auch hoffentlich nicht vergessen, die entsprechende Using direktive hinzuzufügen). Desweiteren kenn ich das .net compact framework nur in der Version 3.5 und kann den quellcode nur für eben dieses Framework bereitstellen.... Bearbeitet 21. April 2010 von Gateway_man Zitieren
Mentator Geschrieben 21. April 2010 Autor Geschrieben 21. April 2010 Using ist drin, keine sorge. Was deinen einwand angeht: ich bin noch nicht einmal dafür solche sachen wie linkadressen in eine datei zu schreiben. aber mein chef will es so. Da ich aber der einzige bin der das ganze verwirklicht, es aber später mehr als nur mich geben wird der die seite weiter verwaltet ist die sache mit der schlange (~ - Ein Matheprof nannte das bei mir immer schlange ) beim besten willen nicht idiotensicher. Die idee hatte ich nämlich auch schon, habe sie aber wieder verworfen. das mit den zeilen ist auch nicht direkt drauf versteifen bei mir aber es fällt mir halt kaum eine andere methode ein das in SL zu realisieren, ohne dabei die Mölichkeit zu gefährden diese Datei mittels php für html aus zu lesen um dort die gleiche funktion zu erzielen, nämlich bereits bestehenden Hyperlinks (SL und HTML) eine zieladresse zu zu weisen. Ich bin langsam echt am verzweifeln, weil ich sitz an diesem Prob jetzt bestimmt schon eine woche rum. Zitieren
Pointerman Geschrieben 21. April 2010 Geschrieben 21. April 2010 Moin! Die Idee mit dem Split ist wohl schon ganz gut. Versuch doch mal einen Split mit Split('\n'). Ich meine mich zu erinnern, dass ich das in der Vergangenheit schon einmal erfolgreich angewendet habe. Zitieren
Mentator Geschrieben 21. April 2010 Autor Geschrieben 21. April 2010 Hmmmmm, nunja die idee ist gut. Leider bekomme ich es nicht hin das der als trennparameter '/n' akzeptiert. es muss laut VS2008 ein char[] sein und '/n' ist wenn mich mein einmaleins nicht im stich lässt ein string. Herr Gott verdammt warum kann es keine logische Programmiersprache geben, die auch für uns Menschen einfach ist. (Bitte um Verzeihung, aber das brauchte ich jetzt) Zitieren
Mentator Geschrieben 21. April 2010 Autor Geschrieben 21. April 2010 Jaaawwwwwwooooooooollllllllllllll. Ich habs geschafft. private void linkvergabe() { WebClient webClient = new WebClient(); webClient.DownloadStringCompleted += WebClientDownloadStringCompleted; webClient.DownloadStringAsync(new Uri("Partner/Partner-Links.txt", UriKind.Relative)); } private void WebClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error == null) { int o = 0; string[] line = e.Result.Split(new Char[] { '\n', '\r' }); o = line.Length; switch (o) { case 1: Pl1.NavigateUri = new Uri(line[0]); break; case 3: Pl1.NavigateUri = new Uri(line[0]); Pr1.NavigateUri = new Uri(line[2]); break; case 5: Pl1.NavigateUri = new Uri(line[0]); Pr1.NavigateUri = new Uri(line[2]); Pl2.NavigateUri = new Uri(line[4]); break; case 7: Pl1.NavigateUri = new Uri(line[0]); Pr1.NavigateUri = new Uri(line[2]); Pl2.NavigateUri = new Uri(line[4]); Pr2.NavigateUri = new Uri(line[6]); break; case 9: Pl1.NavigateUri = new Uri(line[0]); Pr1.NavigateUri = new Uri(line[2]); Pl2.NavigateUri = new Uri(line[4]); Pr2.NavigateUri = new Uri(line[6]); Pl3.NavigateUri = new Uri(line[8]); break; case 11: Pl1.NavigateUri = new Uri(line[0]); Pr1.NavigateUri = new Uri(line[2]); Pl2.NavigateUri = new Uri(line[4]); Pr2.NavigateUri = new Uri(line[6]); Pl3.NavigateUri = new Uri(line[8]); Pr3.NavigateUri = new Uri(line[10]); break; case 13: Pl1.NavigateUri = new Uri(line[0]); Pr1.NavigateUri = new Uri(line[2]); Pl2.NavigateUri = new Uri(line[4]); Pr2.NavigateUri = new Uri(line[6]); Pl3.NavigateUri = new Uri(line[8]); Pr3.NavigateUri = new Uri(line[10]); Pl4.NavigateUri = new Uri(line[12]); break; case 15: Pl1.NavigateUri = new Uri(line[0]); Pr1.NavigateUri = new Uri(line[2]); Pl2.NavigateUri = new Uri(line[4]); Pr2.NavigateUri = new Uri(line[6]); Pl3.NavigateUri = new Uri(line[8]); Pr3.NavigateUri = new Uri(line[10]); Pl4.NavigateUri = new Uri(line[12]); Pr4.NavigateUri = new Uri(line[14]); break; } } else MessageBox.Show(e.Error.Message); } private void Check(object sender, RoutedEventArgs e) { if (Pl1.NavigateUri == null) { MessageBox.Show("Es ist ein Fehler aufgetreten. Wir bitten um Entschuldigung\r\nSollte dieses Problem mehrfach auftreten bitten wir Sie den Webmaster zu informieren!","Linkfehler",MessageBoxButton.OK); } } So schauts aus und funzt auch. mein Gott das war eine echt schwere Geburt. Zitieren
Guybrush Threepwood Geschrieben 21. April 2010 Geschrieben 21. April 2010 Du solltest dir mal das Prinzip einer Schleife anschauen Zitieren
Gateway_man Geschrieben 21. April 2010 Geschrieben 21. April 2010 Wie mein vorredner schon sagte, ist die Nutzung der Switch Case hier fehl am Platz. An deiner Stelle würd ich lieber eine For Schleife nutzen: for (int i = 0; i <= (line.Length -1); i++) { Pl1.NavigateUri = new Uri(line[i]); } ...... Zitieren
Mentator Geschrieben 22. April 2010 Autor Geschrieben 22. April 2010 Das fiel mir auch zuerst ein, nur gibt es da zwei Probleme wenn ich mit ner Schleife arbeite. 1. ist nur jede zweite zeile in meinem gesplitteten String zu gebrauchen, ab der ersten. Was man vlt noch mit einer geschickten auswahl umgehen kann. 2. (und der knackpunkt weshalb ich auf switch gegangen bin) Falls es euch auffällt, die Bezeichner der navigateUri ändern/erweitern sich. Mir fällt jetzt aber keine möglichkeit ein diese in schleifenform zu variieren. Zudem hat sich komischerweise bei mir ein Prob ergeben was ich nicht verstehe. Wenn ich diese Silverlight anwendung im Debugging starte um einen Testlauf durch zu führen läuft alles wunderbar. schiebe ich das Projekt auf den Server um sie übers inet zu prüfen werden keinerlei Adressen vergeben. Ich vermute es liegt an der Dateifreigabe/zugriffsberechtigung. Da ich allerdings nur Hobbymäßig Programmiere und eigentlich IT-Systemelektroniker bin habe ich nicht den blassesten schimmer wie man eine solche freigabe erteilt. Zitieren
Mentator Geschrieben 22. April 2010 Autor Geschrieben 22. April 2010 Ok, es scheint wirklich daran zu liegen das ich mit dem Webclient keine zugriffsberechtigung für die datei habe. Soweit ich über MSDN in Erfahrung bringen konnte kann ich das per clientaccesspolicy.xml aber erlauben. Nur funzt es nicht zumindest nicht so: <?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy> Weiß einer was damit an zu fangen und mir vlt zu helfen? Zitieren
Gateway_man Geschrieben 22. April 2010 Geschrieben 22. April 2010 Das fiel mir auch zuerst ein, nur gibt es da zwei Probleme wenn ich mit ner Schleife arbeite. 1. ist nur jede zweite zeile in meinem gesplitteten String zu gebrauchen, ab der ersten. Was man vlt noch mit einer geschickten auswahl umgehen kann. Versteh ich nicht. Warum dann erst wegschreiben, wenn diese eh nicht zu gebrauchen ist. 2. (und der knackpunkt weshalb ich auf switch gegangen bin) Falls es euch auffällt, die Bezeichner der navigateUri ändern/erweitern sich. Mir fällt jetzt aber keine möglichkeit ein diese in schleifenform zu variieren. Dynamische deklaration von controls (ich geh mal davon aus das das navigateurl ne Property vom Webbrowser Control ist). Sprich ein Control Array deklarieren. Wobei die größe der Elemente abhängig von den gespliteten Uris sind. Zitieren
Mentator Geschrieben 23. April 2010 Autor Geschrieben 23. April 2010 Versteh ich nicht. Warum dann erst wegschreiben, wenn diese eh nicht zu gebrauchen ist. Also die adressen zu denen ich verlinken möchte stehen in einer textdatei, welche ich per webclient auslese (Mal abgesehen das es scheinbar nur lokal per Debuggen funzt, denn sobald ich es online stelle wird scheinbar der zugriff auf die datei verweigert). Diese Daten werden dann per Result.Split in ein Array übertragen, wobei jede zweite zeile den zeilenumbruch darstellt, leider wird dieser als ""-Wert ebenfalls als Arrayglied übernommen. Somit bleibt lediglich jeder Zweite Eintrag in diesem Array für mich von Wert denn was soll ich mit einem Zeilenumbruch anfangen? Dynamische deklaration von controls (ich geh mal davon aus das das navigateurl ne Property vom Webbrowser Control ist). Sprich ein Control Array deklarieren. Wobei die größe der Elemente abhängig von den gespliteten Uris sind. Um ehrlich zu sein ich versteh grad nur Bahnhof. Der NavigateURL ist eine Property von Hyperlinkbuttons aus der zugehörigen Xaml. Diese sind bereits fest in die xaml-Datei implementiert, ich will ihnen lediglich den aus dem Array zugehörigen Link-Wert zuweisen. Wenn Ihr für dieses Prob eine bessere Möglichkeit kennt immer raus damit. Grad was den Zugriff auf die txt datei angeht, sobald das gesammte Projekt online ist, habe ich ja tierische Probleme. Zitieren
Mentator Geschrieben 20. Mai 2010 Autor Geschrieben 20. Mai 2010 (bearbeitet) OK, ich habe jetzt alle Probleme lösen können, teils wars meine eigene Schuld, wenn man halt zu blöd ist ALLE aktuellen Daten für das SL-Projekt auf den Server zu schieben.:upps private void linkvergabe() { WebClient webClient = new WebClient(); webClient.DownloadStringCompleted += WebClientDownloadStringCompleted; webClient.DownloadStringAsync(new Uri("Path/Links.txt", UriKind.Relative)); } private void WebClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error == null) { int o = 0; string[] line = e.Result.Split(new Char[] { '\n' }); o = line.Length; if (o >= 1) { if (line[0] != "") { if (line[0] != "\r") { Pl1.NavigateUri = new Uri(line[0]); } } } if (o >= 2) { if (line[1] != "") { if (line[1] != "\r") { Pr1.NavigateUri = new Uri(line[1]); } } } if (o >= 3) { if (line[2] != "") { if (line[2] != "\r") { Pl2.NavigateUri = new Uri(line[2]); } } } if (o >= 4) { if (line[3] != "") { if (line[3] != "\r") { Pr2.NavigateUri = new Uri(line[3]); } } } if (o >= 5) { if (line[4] != "") { if (line[4] != "\r") { Pl3.NavigateUri = new Uri(line[4]); } } } if (o >= 6) { if (line[5] != "") { if (line[5] != "\r") { Pr3.NavigateUri = new Uri(line[5]); } } } if (o >= 7) { if (line[6] != "") { if (line[6] != "\r") { Pl4.NavigateUri = new Uri(line[6]); } } } if (o >= 8) { if (line[7] != "") { if (line[7] != "\r") { Pr4.NavigateUri = new Uri(line[7]); } } } } else MessageBox.Show(e.Error.Message); } Es funktioniert einwandfrei. Problem: zusätzliche Leerzeilen im Split Lösung: Der Split sollte tunlichst nur an einem Zeichen liegen. /r/n bei beiden Teilen zu trennen bringt die extra Zeilen. (BTW: als ich die URL zur Datei auf absolute umgestellt habe wurde der String nur mit /n's übergeben. Seitdem ich einen relativen Pfad benutze kommt ein zusätzliches /r im String selbst vor. Kann mir das mal einer erklären?) Problem: Switch oder wie jetzt mehrfache If-Verschachtelung Lösung: Switch war doof ich gebs zu aber mein Programmierwissen kennt nunmal Grenzen . die Verschachtelung der If's ist notwendig denn Verschachtele ich sie nicht sondern binde sie alle mittels || in eine anweisung kommen Fehler zu hauf zustande. Warum weiß ich nicht, sollte ja eigentlich identisch sein oder? Problem: Dateizugriff Lösung: die clientpolicyaccess war völlig korrekt und muss so im Root-Ordner stehen. Viel mir auf als ich absolute Pfade gebrauchte und das ganze aber lokal laufen lies. Dateizugriff war da kein ding mehr. <?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy> OK, Danke euch nochmal für die Hilfestellungen und ich hoffe das hier Hilft allen anderen weiter. Bearbeitet 20. Mai 2010 von Mentator Zitieren
Pointerman Geschrieben 20. Mai 2010 Geschrieben 20. Mai 2010 (bearbeitet) Moin! Ein paar Anmerkungen zu Punkt 2: Die Verknuepfung der if-Bedingungen erfolgt mit UND && und nicht mit ODER ||, da ja beide Bedingungen erfuellt sein muessen. Z.B.: if ((line[1] != "") && (line[1] != "\r")) Warum packst Du Deine Objekte (pl*, pr*) nicht in ein Array oder eine Liste und lauefst mit einer Schleife drueber? string[] lines = e.Result.Split(new Char[] { '\n' }); int objIndex = 0; //objList ist die Liste mit Deinen Objekten foreach (string line in lines) { if ((line != "") && (line != "\r")) { objList[objIndex].NavigateUri = new Uri(line); objIndex++; if (objIndex >= objList.Length) { break; } } } [/PHP] Bearbeitet 20. Mai 2010 von Pointerman Zitieren
Mcolli Geschrieben 20. Mai 2010 Geschrieben 20. Mai 2010 Moin scheinst Dein Problem ja mittlerweile in den Griff bekommen zu haben. Ich wollte Dir aber mal ans Herz legen Strukturen(wie eine URI-Liste) besser in einer .xml statt in einer .txt abzulegen. Das bietet gerade bei Silverlight / WPF einige Vorteile: Du kannst einfach über die XML Tags Iterieren XMLReader Klasse).Du kannst die Tags mit Atributen versehen die es Dir einfacher machen den Code später zu erweiteren (was ist wenn der Cheff will dass manche Links nur Bestimmte Benutzer Gruppen sichtbar sind).Ein "Merge" einer auf den Client-Seite erzeugten XML-Datei und einer für die anzeige relevanten XML-Datei auf dem Server ist auch einfach möglich. Desweiteren solltest Du Dich mal mit dem "Sicherheitsfeatures von Silverlight auseinander setzen. Meinen Erfahrungen nach ist die Benutzung eines StreamReader / Writers um auf ein lokales Filesystem zuzugreifen nur dann in Silverlight möglich wenn die Silverlight Anwendung als Out-Of-Browses Anwendung läuft. In der Version 4 des .Net Frameworks wurde das ganze FileAccess Modell wohl noch mal kräftig überarbeitet. So wird mittes der IsolatedStorageFile ein lokaler Speicherbereich für den aktuellen Nutzer sowie ein IsolatedStorageFileStream zum lesen /schreiben erstellt. Ich besitze einen sehr guten Einsteiger-Artikel zum Thema Security in Silverlight den ich auf PN-Anfrage Dir gerne in eingescanter Form zu kommen lasse - Warum das nicht hier im Forum geht sollte klar sein. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.