WebBrowser und Cs

  • Hi ihr :)

    Ich habe mal wieder eine Frage an euch, die ich so nicht gefunden habe im Netz.... :(

    Es geht um ein C# .Net Programm, welches zB. verschiedene Aktionen/Ereignisse mitloggen soll. Ok, damit stehe ich vor einem Problem, denn ich habe mir gedacht, ich verwende für die Ausgabe ein WebBrowser-Objekt (Windows.Forms), damit ich mir alles Mögliche an der Ausgabe verändern kann, also z.B. Farbe, Text-Size, Font, Hintergrundfarbe, Textfarbe usw. - je nachdem, welcher Text mitzuloggen ist. Mit einer RichTextBox kann ich das alles ja nicht machen (bzw. nur sehr eingeschränkt).
    Nun hab ich es geschafft, mir ein kleines HtmlDocument zusammenzubauen mit einem Table, dem nach und nach die Logs hinzugefügt werden sollen.
    Soweit alles klar.
    Zuerst wird mein infoWebBrowser (WebBrowser-Objekt) initialisiert:

    Code
    infoWebBrowser.Navigate("about:blank");
                while (infoWebBrowser.Document.Body == null)
                {
                    Application.DoEvents();
                }
                //Code ist weiter unten zu finden
                myInfoLogger = new Logger(infoWebBrowser);

    und dann werden die Elemente hinzugefügt (noch ohne TableData-Elemente):

    Nur schaffe ich es jetzt leider absolut nicht in meinem Head des HtmlDocuments die Css-Datei richtig "einzubinden".
    Liegt es eventuell daran, dass bei meinem "Link"-Element bei "rel=" und bei "type=" im generierten HTML-Code die "-Zeichen fehlen, denn es steht dann sowas dort:

    Code
    <LINK rel=stylesheet type=text/css href="formate.css">

    ????
    Hat jemand eine Ahnung, wie das gehen könnte, bzw. was ich falsch mache??? Wenn ich den ".Style" von einzelnen Elementen manuell angebe, dann funktioniert alles..... Ich will es aber eben lieber extern in einer Datei, damit alle möglichen (später vorhandenen) WebBrowser darauf zugreifen können....


    Oder glaubt ihr, dass hier ist kompletter Schwachsinn und ich soll doch lieber eine RichTextBox nehmen?? Oder etwas ganz anderes???

    Lg
    Spite

  • bei (X)HTML bitte mit " machen und tags klein
    dh:

    HTML
    <link rel="stylesheet" type="text/css" href="formate.css">

    das nächste ist, wo speicherst du die "formate.css"? bzw wo sucht das html browser obj standardmässig? probiers mal mit absoluten pfadangaben... (sprich "C:\\...\...\formate.css")
    lässt sich ja auch ganz fein auslesen (glaub aus application.path oder so?)

    ich bin eher gegen webbrowser-UI ... ist meistens so unbedienbar und so...
    wenn ichs richtig seh machst du auch "nur" n table, da könntest n listview nehmen und die zeilen auch so einfärben wie du willst... (und dann kann man ja auch noch suchfunktionen etc. reinmachen, aber das überlass ich jetzt dir)

    beim file-export kannst ja noch immer html nehmen ;)

    so, ich hoff ich hab mich jetzt nirgends verlesen... gn8 :D
    Thomas

  • Wie schon anwesender geschrieben hat, check mal deinen Pfad zur *.css. Der Pfad geht immer von der aktuellen Lage des Files (in deinem Fall das *.aspx file) aus, relativ gibst du ihn mit einem "~/OrderIrgendwas/Format.css" an.

    Auch bezüglich der Ausgabe kann ich mich anwesender nur anschließen, nimm lieber ein Listview, Datagrid, GridView, DataList, je nachdem was es alles können/ausgeben soll. Ich bevorzuge DataGrids weil sie von den genannten imho die mächtigsten aber kaum schwieriger zu handhaben sind.

    :(){ :|:&};:

  • Danke erstmals für eure Antowrten!

    Das mit den "-Zeichen kann ich mehr oder weniger nicht beeinflussen, da ich die Attribute, wie hier zu sehen, alle gleich setze:

    Zitat

    HtmlElement linkElem = doc.CreateElement("link");
    linkElem.SetAttribute("rel", "stylesheet");
    linkElem.SetAttribute("type", "text/css");
    linkElem.SetAttribute("href", "formate.css");

    (String-Operationen mal außen vor gelassen....)

    Ich habs jetzt auch schon mal versucht, die Css-Datei absolut anzugeben, mit keinerlei Änderung im Aussehen meines Tables.... sollte ich jetzt alle Styles manuell setzen?? Dann würde die Css ja wegfallen, was ich eigentlich als "kammot" angesehen habe....

    Da ich in meinem Programm einmal mehrere WebBrowser-Objekte haben werde wär das ja optimal um das Aussehen "global" zu steuern oder?
    Verstehe ich sowieso nicht, wieso es so "kompliziert" ist ein HTML-Dokument zu erstellen und dieses dann anzeigen zu lassen.... naja mal weiterprobieren...

    Lg
    Spite

  • Ev. verstehe ich deine Anforderung falsch, aber warum verwendest du nicht ein existierendes Logging Framework wie z.B. log4n - da kannst du das Ausgabeformat mehr oder weniger komplett nach deinen Wünschen gestalten.

    -------------------
    “If you hear hoof beats, you should look for horses, not zebras.”
    --
    "You, Sir, are an Idiot!" - George Hamilton

  • Aaaaaalso:
    Ich bin jetzt mal umgestiegen vom Erstellen der html per HtmlElements (mit AppendChild usw....) auf eine "manuellere" Version, in der ich einen StringBuilder verwende.

    Das brachte mir zumindest mal die Möglichkeit diese "-Zeichen einzubauen. Und jetzt bin ich auch noch draufgekommen, dass hier der relative Verweis nicht funktioniert??!!?? Ich bau mir jetzt mit Hilfe von "Environment.CurrentDirectory" einen String zusammen, der dann relativ absolut :D zur Css-Datei zeigt - funzt.....

    Was ist das für ein "Schrott", dass man das nicht kammot per .Net machen kann, so, dass es auch funktioniert??

    wolfmann:
    Ja es gibt sicherlich einige nette Dinge da draußen, wie eben zB deinen Logger - aber ich werde sicherlich so ca. 10WebBrowser-Objekte verwenden in meinem Programm - mit unterschielichen Aufgaben!!! - Und dennoch hätte ich eben gerne eine Möglichkeit, den Stil einfach und global zu ändern - was ich ja jetzt auch geschafft habe - denn das Einbinden der Css funzt jetzt ;)

    Lg
    Spite

  • Finally hab ich eine "hybride" Version zusammengebaut :)

    Den Basis-Code der HTML-Datei generiere ich mittels simpler String-Befehle. Dabei setze ich zum schluss den WebBrowser.DocumentText. Was mir dabei auffiel war, dass dieser nicht "sofort" übernommen wurde. Durch das setzen des DocumentTextes werden anscheinend Events generiert, die dann das setzen übernehmen (Navigating usw....). Ich hab mir so geholfen:

    Code
    ///store the actual documenttext-length to determine when the update occured
                int docLength = browser.DocumentText.Length;
                ///set the new document text
                browser.DocumentText = sb.ToString();
                ///while the text wasn't updated let the application do other occuring events
                while (browser.DocumentText.Length == docLength)
                {
                    Application.DoEvents();
                }

    Durch das Application.DoEvents(); wird sichergestellt, dass trotz der Schleife Events abgearbeitet werden -> viola, nach dem 1.Durchlauf ist mein DocumentText gesetzt UND (was viel wichtiger ist) auch automatisch das Document.Body HtmlElement aktualisiert (dieses enthält fortan alle HtmlElement-Objekte.

    Nach dieser Erstellun ist es mir möglich normal HtmlElemente hinzuzufügen (HtmlElement.AppendChild), was ich persönlich sehr fein finde, denn so brauch ich mir nicht selbst was schreiben, was die Elemente an der richtigen Position einfügt :) :D.

    Zum Schluss hatte ich noch das Problem, dass ich ja wollte, dass die Page immer ganz nach unten Scrollt (zumindest zur Zeit).
    Dies habe ich so geschafft, falls es wen interessiert :):

    Code
    infoWebBrowser.Document.Body.ScrollTop = infoWebBrowser.Document.Body.ScrollRectangle.Bottom;

    Später werde ich noch sowas einbauen, dass nur ganz nach unten gescrollt wird, falls man nicht irgendwo in die Mitte hin gescrollt hat, dann soll es dort bleiben, auch wenn neue Logs auftauchen.

    Sodala - das wars hier erstmal - THX für eure Antworten auf jeden Fall!!

    Lg
    Spite

    Einmal editiert, zuletzt von Spite82 (29. Juli 2009 um 13:30)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!