Laden...

Forenbeiträge von ravel Ingesamt 169 Beiträge

20.08.2009 - 09:34 Uhr

Hi Tom,

stimmt, damit läufts. Besten Dank!

Aber ist so ein dns lookup mit windows-boardmitteln nicht zu erreichen? "nslookup" gibt mir leider nicht das gewünschte ergebnis zurück. (nur so aus interesse, die lösung hab ich ja jetzt)

19.08.2009 - 22:07 Uhr

Hi,

auf http://abuse.net/using.phtml ist beschrieben, wie man mittels dns-lookup die datenbank von www.abuse.net abfragen kann um an die abuse-adresse eines providers zu kommen.

bei einem dns-lookup auf "web.de.contacts.abuse.net" kriegt man "abuse@web.de" zurück.

ich möchte das ganze nun in einem c#-programm nutzen und hab mir bereits angesehen, wie man einen dns-lookup macht.


            IPHostEntry he = Dns.GetHostByName("web.de.contacts.abuse.net");
            IPAddress[] ip_addrs = he.AddressList;
            IPAddress adrs = ip_addrs[0];    

Nur leider finde ich mittels debugger dort nirgends die information, die ich suche, nämlich das "abuse@web.de"

kann mir jemand sagen, wie ich an die info rankomme?

13.08.2009 - 09:03 Uhr

webseiten, die asp.net benutzen: http://www.asp.net/get-started/
webseiten, die asp.net mvc benutzen (ganz runterscrollen): http://www.asp.net/mvc/whatisaspmvc/

31.07.2009 - 10:19 Uhr

nee antwort auf meine frage?!

😁

18.06.2009 - 23:26 Uhr

Hi,

ich benutze auf meiner Seite jQuery-Tooltips (http://jquery.bassistance.de/tooltip/demo/ ).

 $(function attachTooltip() {
                $(".infoBox").tooltip();
            });

Das klappt auch wunderbar, bis in dem UpdatePanel ein postback ausgelöst wird. Danach sind die Tooltips wieder ganz normale Tooltips, ohne das jQuery-Geschnörkel.

Ich habe schon rausgefunden, dass ich die Tooltip-Funktion erneut aufrunfen muss. (Quelle: http://www.nabble.com/jQuery-tooltip-doesn%27t-work-after-UpdatePanel-update--td17350149s27240.html )

So rufe ich die attachTooltip-Funktion bei jedem partiellen Postback neu auf:

        function pageLoad(sender, args) {
            if (args.get_isPartialLoad()) {
                attachTooltip();
            }
        }

Das ganze funktioniert auch wunderbar im IE8. In Firefox ist es aber so, dass nach dem ersten partiellen Postback (nachdem attachTooltip() erneut aufgerufen wurde) das UpdatePanel ein Submit mehr ausführt. Es reagiert also nicht mehr auf Button-Klicks und verhält sich auch sonst eigenartig.

Wie löse ich das Problem?

13.05.2009 - 10:21 Uhr

Hi Leute,

ich habe eine GridView in der Artikel stehen. Die aktuelle Filterung und Sortierung soll immer in der URL im QueryString sichtbar sein.
z.B. www.webseite.de/artikel.aspx?suche=buch&sortBy=preis&sortDir=asc

Ich benutze im moment eine ziemlich dahergepfuschte Lösung (die u.A. auch noch Überläufer verursacht...) um die Sortierung und das Paging im QueryString zu realisieren.

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
        {
            Session["SortDirection"] = Server.UrlEncode(Convert.ToString(e.SortDirection));
            Session["SortExpression"] = Server.UrlEncode(e.SortExpression);
            e.Cancel = true;
            PerformQuery();
        }

PerformQuery baut den QueryString zusammen und öffnet die Seite.
Wenn der User auf eine Spaltenüberschrift zum filtern drückt, wird er also per Response.Redirect auf die gleiche Seite (artikel.aspx) geschickt, nur dass der QueryString jetzt die Filterung und Sortierung enthält.

Beim GridView_DataBound-event wende ich die über den QueryString gekommene Sortierung dann an:

 if (Request.QueryString["sortDir"] != null && Request.QueryString["sortExp"] != null)
            {
                GridView1.Sorting -= GridView1_Sorting;
                GridView1.DataBound -= GridView1_DataBound;
                GridView1.Sort(Server.UrlDecode(Convert.ToString(Request.QueryString["sortExp"])), (SortDirection)Enum.Parse(typeof(SortDirection), Server.UrlDecode(Request.QueryString["sortDir"])));
                GridView1.Sorting += GridView1_Sorting;
                GridView1.DataBound += GridView1_DataBound;
            }

Ich muss die Events vorher abkoppeln, damit es zu keiner Endlosschleife kommt. - Sehr unsauber.

Wie löst man sowas besser? Ich breche das sortieren ab, leite den Benutzer per Redirect weiter und will dann die Sortierung ausführen.

06.04.2009 - 16:21 Uhr

verwendetes Datenbanksystem:XML

Hi,

ich habe eine große Menge an XML-Dateien, die ich per XMLDocument.LoadXML einlesen möchte. Leider sind sogut wie alle XML-Dateien invalide, sprich in den den Werten sind z.B. spitze Klammer verwendet worden:

<Person Name="<Werner" />

anstatt

<Person Name="&lt;Werner" />

Diese XML-Dateien müsste ich vor dem einlesen also erstmal "reparieren". Gibt es da bereits fertige Methoden?

06.03.2009 - 17:13 Uhr

Danke für deine Antwort.

Was empfiehlt sich denn für eine Seite wie eBay? (lange Liste von Artikeln, auf die jeder zugreifen möchte, die sortierbar sein sollte und paging unterstützen soll) Ohne Caching kommt man da wohl nicht weit.

Ich denke, mit dem DataReader kann man nur Caching betreiben, wenn man das Ergebnis ist ein DataSet/DataTable läd. Wenn man das nicht macht, muss der DataReader bei jeder Abfrage aufs neue SQL-Queries an die Datenbank senden. In meinen Augen eine unperformante Lösung.

Also die eigentliche Aussage ist, dass ein typisiertes DataSet langsamer ist als ein DataSet?

Ich will das Ergebnis nicht clientseitig sondern serverseitig cachen. Der Server hat genügend RAM um 100.000 Datensätze im Speicher zu halten.

Ich will jetzt nicht typisierte DataSets vertedigen, sondern suche nur die beste Variante den Datenzugriff zu realisieren.

06.03.2009 - 16:15 Uhr

so müsste es gehen:
((FileUpload)FindControl("MeinFileUpload")).MeineEigenschaft = Wert;

Edit: Sehr nützlich ist es auch eine rekursive FindControl-Methode zu verwenden. Wie z.B. das Beispiel von Peter:
http://www.aspnetzone.de/blogs/peterbucher/archive/2009/01/20/findcontrol-mal-anders-iterativ-rekursiv-generisch-mit-bedingungen.aspx

06.03.2009 - 15:59 Uhr

Es könnte in einem Container liegen (Panel, FormView, UpdatePanel, usw). Meines Wissens nach kann man an solche Controls nur mit FindControl() rankommen.

06.03.2009 - 15:56 Uhr

Hi,

ich möchte eine Webanwendung erstellen in der, ähnlich wie bei eBay, eine große Liste von Einträgen aufgelistet (GridView) werden soll. Die GridView soll sortierbar sein und Paging unterstützen. Größenordnungen kann ich noch nicht nennen, aber die Anwendung sollte auch mit mehr als 100.000 Einträgen klarkommen können.

Ich habe jetzt schon oft gehört, dass man für solche Vorhaben besser einen DataReader statt eines typisierten DataSets verwenden soll, weil der Reader einfach schneller ist. Momentan benutze ich ein typisiertes DataSet, erstellt mit dem DataSet-Designer von Visual Studio 2008, weil es sehr kompfortabel ist.

Andererseits liest man auch immer, dass man von Caching gebrauch machen soll, um die Performance einer Seite zu verbessern.

Jetzt bin ich etwas verwirrt. Wenn ich einen DataReader zum lesen der Datensätze aus der Datenbank benutze, der ja deshalb so schnell ist, weil der Overhead des typisierten DataSets wegfällt, kann ich doch kein Caching benutzen, weil es kein DataSet gibt, dass ich cachen kann!? Wenn ich aber den DataReader dazu benutze ein DataSet zu füllen um es zu cachen und als DataSource für mein GridView verwenden zu können, hab ich ja quasi wieder ein typisiertes DataSet, von dem alle Leute aus Performancegründen abraten.

Mir ist auch noch nicht klar, wie ein DataReader beim Sortieren schneller sein soll als ein DataSet. Der DataReader wird doch für jede Sortierung einen neuen SQL-Query (order by XYZ) auf die Datenbank loslassen müssen, wodurch für jede Sortierung die Datenbank arbeiten muss. Ist es nicht schneller ein gecachtes DataSet im Arbeitsspeicher zu sortieren?

Vielleicht kann mich ja jemand aufklären.

Soll ich nun für mein Vorhaben lieber einen DataReader benutzen? Kann man Caching und DataReader vereinbaren?

Danke und Gruß

03.03.2009 - 09:03 Uhr

Hi,

ich trage mit einem FormView Daten per ObjectDataSource in die Datenbank.
Gibt es eine einfache Möglichkeit vor dem speichern der Daten eine Vorschau anzuzeigen? Also quasi den Modus vom FormView von Insert auf ReadOnly setzen (nur das bringt leider nicht den gewünschten Effekt).

Der Grund für eine Vorschau-Funktion ist bei mir der, dass ich die FormView-Felder in einem Wizard aufgeteilt habe, so dass der Benutzer nicht den ganzen Wust als Feldern auf einer Seite sieht. Zum Schluss möchte ich dem Benutzer aber die Möglichkeit bieten sich eine Vorschau von seinen Daten anzeigen zu lassen, also alle Daten auf einen Blick.

Wie kann man sowas am besten realisieren?

03.03.2009 - 08:54 Uhr

Hi,

ich habe ein FormView, in dessen InsertTemplate ein Wizard liegt. Beim WizardFinishStep habe ich den Button "Finish" rausgeworfen und dafür den Button "Einfügen" aus dem FormView an die Stelle gesetzt.

Nun habe ich folgendes Verhalten, wenn man auf den Button "Einfügen" drückt:

  • Das Insert vom ObjectDataSource wird aufgerufen, so wie es sein soll
  • Der Wizard ändert nicht seinen Zustand. Er bleibt im letzten Schritt.

Erst beim erneuten anklicken des "Einfügen"-Buttons, springt das FormView wieder in den ReadOnly-Modus und zeigt den neu hinzugefügten Datensatz an.

Es liegt wohl daran, dass ich dem Wizard den Finish-Button geklaut habe. Ich möchte aber, dass der User beim letzten Schritt im Wizard einfach auf "Einfügen" klicken muss und nicht erst auf "Finish" und dann auf "Einfügen".

Danke für Eure Hilfe

EDIT: hat sich erledigt. das problem war, dass ich innerhalb den insertTemplates des formviews ein updatepanel platziert habe. ich habe das updatepanel jetzt um die gesamte formview platziert und nun läufts.

21.02.2009 - 18:12 Uhr

Hi,

ihr kennt ja sicher diese tolle Kommentar-Funktion von Visual Studio, die einem eine Kommentarvorlage über eine Methode klatscht, wenn man über der Methode 3 mal Schrägstrich (///) tippt.

Kann man diesen Kommentarblock irgendwie updaten, wenn man mal einen Parameter zur Funktion hinzufügt oder entfernt oder muss man ihn dann manuell hinzufügen/entfernen?

11.02.2009 - 20:03 Uhr

Jup. MSSQL ist mir zu teuer und MSSQL-Express reicht mir nicht aus (max. 1 GB an Datenbankkapazität). MySQL ist doch ideal für Webprojekte.

11.02.2009 - 18:01 Uhr

@robert.wachtel

Ich glaube diese Infos beziehen sich nur auf die kurzfristige Aktion zum Erwerb der Professional-Edition.
Wenn man sich lediglich Visual Studio Express herunterladen muss, um die Upgrade-Version von Visual Studio 2008 Standard benutzen zu dürfen, würde wohl niemand mehr die Vollversion kaufen.

@FZelle
Jo, die kann alles, was ich brauche. Bei den Express-Editionen fehlt mir momentan lediglich der Addin-Support, da ich einen MySQL-Connector-Addin in Visual Studio benutzen möchte.

11.02.2009 - 10:54 Uhr

Hi,

ich möchte mir die VS2008 Standard zulegen. Die Vollversion kostet ja rund 260 Euro, das Upgrade ist bereits für ca. 170 zu haben.

Der Inhalt Upgrade-Version ist, soweit ich weiß, der gleiche wie der der Vollversion. Es wird bei der Installation also nicht geprüft, ob man bereits eine alte Visual Studio-Version installiert hat. Ist das richtig?

Meine Frage ist jetzt, was für eine Vorgängerversion von Visual Studio benötige ich rein rechtlich, damit ich das Upgrade nutzen darf? Kann ich mir einfach günstig eine 2003-er gebraucht kaufen?

04.02.2009 - 23:56 Uhr

Die Default-Werte der Parameter unter "Datenquelle konfigurieren" ist "%".

Hier ist meine where-Klausel:

WHERE        (x_items.title LIKE CONCAT(CONCAT('%', @searchtext), '%')) AND (cast(x_items.user_id as char) LIKE @user_id) AND (cast(x_items.fk_game_id as char) LIKE @fk_game_id) OR
                         (cast(x_items.user_id as char) LIKE @user_id) AND (cast(x_items.fk_game_id as char) LIKE @fk_game_id) AND (x_items.description LIKE CONCAT(CONCAT('%', @searchtext), '%'))

Leider bekomme ich immer ein "Die Eingabezeichenfolge hat das falsche Format. " beim Aufruf der Seite.

04.02.2009 - 23:36 Uhr

Hi,

ich benutze ein ObjectDataSource mit einem TableAdapter um eine Tabelle abzufragen, in der sich eine Integer-Spalte befindet.

Der Benutzer soll nach Zahlen aus der Integer-Spalte filtern können. Wenn er keine Zahl als Filterkriterium eingibt, sollen natürlich alle Zeilen zurückgegeben werden.

Ich benutze als Datenbank MySQL 5.

In einer Integer-Spalte kann man ja leider keine Wildcards (%) benutzen, daher habe ich versucht den Spalte auf "char" zu casten.

select * from tabelle where cast(userId as char) like '%'

Diese Abfrage funktioniert im MySQL Query Browser wunderbar. Wenn ich sie aber im Abfrage-Editor vom TableAdapter in VS2008 einfüge, meckert VS über das "AS".

"Fehler in der Liste der Funktionsargumente: "AS" wurde nicht erkannt.
Analysieren von Abfragetext nicht möglich."

Wenn ich die Meldung ignoriere und die Abfrage trotzdem speichere, bekomme ich beim Ausführen der Seite ein "Die Eingabezeichenfolge hat das falsche Format. ".

Wie kann ich am einfachsten eine Art Wildcard in einer Integer-Spalte verwenden?

ravel

31.01.2009 - 14:02 Uhr

Hi,

ich habe seit gestern das Problem, dass ein Control bei mir in ASP.NET im Designer nicht mehr angezeigt wird. Das Control funktioniert aber, wenn ich die Webseite anzeigen lassen (Webanwendung starten).

Edit: Verursacher ist eines der .NET-Updates, die gestern gekommen sind, die durch das KB951847 kommen. Ich hab sie deinstalliert und nun wird das Control im Designer wieder angezeigt. Woran kann das liegen?

Danke und Gruß,
ravel

22.01.2009 - 00:19 Uhr

Hi,

ich benutze ein ObjectDataSource, dessen Select-Methode einen Parameter erwartet.
Das ObjectDataSource habe ich an ein GridView angeschlossen.

In der Auswahl der möglichen Parameterquellen fehlt mir irgendwie der Punkt "Public-Variable". Muss ich extra meinen Wert in eines der vorgegebenen Parameterquellen stecken, wie z.B. Session, QueryString, usw. (siehe Screenshot)?

Geht das nicht auch ohne Umweg?

16.01.2009 - 17:35 Uhr

Hallo Peter,

danke für die Info. Ich hab jetzt für die Seite, auf der die Bilder angezeigt werden das Caching deaktiviert.

Nun klappts.

ravel

15.01.2009 - 22:00 Uhr

Hi,

ich habe ein GridView indem ich Bilder anzeige. Wenn die Bilder nun gelöscht werden und der Benutzer ruft erneut die Seite mit dem GridView auf, werden, obwohl das GridView neu generiert wird, noch alle Bilder angezeigt. Erst wenn der Besucher die Website aktualisiert (F5), sind im GridView die gelöschten Bilder nicht mehr zu sehen.

Wie kann ich es erreichen, dass die gelöschten Bilder sofort aus dem Grid verschwinden, ohne dass der Besucher die Seite aktualisieren muss?

Nochmal der Ablauf:
Besucher ist auf bilderliste.aspx und sieht 3 Bilder im GridView.
Besucher wechselt auf Seite home.aspx - in der Zwischenzeit werden 2 Bilder gelöscht.
Besucher geht wieder auf Seite bilderliste.aspx und sieht immer noch die 3 Bilder obwohl bereits 2 gelöscht wurden. Erst wenn er die Seite aktualisiert, sieht er, dass nur noch 1 Bild übrig ist.

Gruß
ravel

02.01.2009 - 17:50 Uhr

hi,

das ist aber eine sehr unbefriedigende lösung.
das heißt ja, dass ich immer an zwei stellen die datenbank-änderungen durchführen muss. doppelte arbeit für eine einzelne sache.

02.01.2009 - 16:08 Uhr

Hi,

und wie verhindere ich, dass meine ganzen Abfragen verloren gehen, die im Table-Adapter stehen?

02.01.2009 - 14:51 Uhr

Hi,

ich habe eine ASP.NET-Webanwendung, die auf eine MySQL-Datenbank zugreift. Die Datenbankverbindung habe ich in Visual Studio 2008 eingerichtet und ein typisiertes Dataset einer Tabelle der Datenbank erstellt (also einfach per Drag&Drop die Tabelle auf den Dataset-Designer geschoben).

Nun habe ich mit dem MySQL Query Browser eine Spalte der Tabelle angepasst (von Varchar(45) auf Varchar(100) geändert.
Mein typisiertes Dateset hat von dieser Änderung aber nichts mitbekommen.

Wie kann ich dem typisiereten Dataset (xsd-Datei) sagen, dass es sich neu erstellen bzw. updaten soll, so dass die Änderungen der drunterliegenden Tabelle mitbekommt?

Danke und Gruß

26.11.2008 - 14:01 Uhr

Hi Peter,

die Verbindung mit dem Assistenten zu erstellen, habe ich bereits versucht. Ich habe aber aufgegeben, weil ich keinen passen Eintrag für eine Verbindung zu einer MySQL-Datenbank gefunden habe. Ich hätte erwartet, dass mein MySQL-Connector mit in der Liste auftaucht, da ich ihn ja zuvor installiert und auch schon erfolgreich benutzt habe (durch manuelles Hinzufügen des ConnectionStrings in die web.config).

Diese Einträge, die mir zur Verfügung stehen, siehst du im angehängten Bild.

jim

26.11.2008 - 13:23 Uhr

Hi,

ich benutze momentan den MySQL-Connector/NET 5.2.5.0 um die ganze Membership-Sache von ASP.NET auf meinem MySQL-Server benutzen zu können. Klappt auch alles soweit.
Nun möchte ich gerne, wie in diesem Video beschrieben http://www.asp.net/learn/videos/video-07.aspx , ein Gridview direkt mit einer Table verbinden per Databinding und somit auch das editieren und hinzufügen von Datensätzen zulassen.
Mein Problem ist nun, dass ich wenn ich auf "Datenquelle konfigurieren" beim SqlDataSource klicke, sehe ich in der Combobox gar nicht meine Verbindung, die ich in der web.config definiert habe!? Screenshot


Hier ist mein Connectionstring.
<connectionStrings>
   <add name="MySQLConnectionString" connectionString="Datasource=localhost;Database=test;Uid=root;Pwd=admin;"
   providerName="MySql.Data.MySqlClient" />
   </connectionStrings>

Ich habe dann testweise den ODBC-Treiber 3.51 (http://dev.mysql.com/downloads/connector/odbc/3.51.html) installiert (der neue 5.1-Treiber funktioniert nämlich gar nicht) und konnte eine Verbindung zu meiner MySQL-Datenbank herstellen. Aber hier gibt es auch einige Probleme. So seh ich z.B. die Tabellen meiner Datenbank im Datenbank-Explorer von Visual Studio nicht. Auch kann ich keine Spalten auswählen, wenn ich beim SqlDataSource-Control auf "Datenquelle konfigurieren" gehe. Ich sehe in der Auflistung der Spalten nur eine Checkbox mit nem Sternchen dran ( * ). Bei MSSql hat es alles geklappt, wie in dem Lernvideo, was ich oben verlinkt habe.

Meine Frage ist nun, was ist überhaupt der richtige Weg für die Verbindung zur MySQL-Datenbank? Kann man den MySQL Connector/NET benutzen oder muss ich mir wirklich per ODBC zur Datenbank verbinden, damit ich Databinding über das SqlDataSource-Control benutzen kann?

04.09.2008 - 12:39 Uhr

Was wird für SQLite eigentlich auf dem Webspace vorausgesetzt? Es ist ja eigenltich nur eine Datei aber trotzdem habe ich gelesen, dass einige Hoster SQLite nicht unterstützen.
http://board.raidrush.ws/archive/t-292433.html

03.09.2008 - 17:02 Uhr

Hi Peter,

das hört sich interessant an. Mit SQLite kann ich also mit wenig aufwand eine eigene Datenbank erstellen, die physikalisch nur aus eine Datei besteht. Wozu brauche ich denn SubSonic? Reicht es nicht, wenn die Datei einfach auf meinen Webspace lade und dem Ordner Schreibrechte gebe?

ravel

03.09.2008 - 16:28 Uhr

Hi,

ich möchte mich in nächster Zeit mit ASP.NET beschäftigen. Daher suche ich mir grade einen passenden ASP.NET-Hoster.
Da ich momentan schon Webspace + MySql-Datenbanken bei Hosteurope habe (der aber leider kein ASP.NET unterstützt), könnte ich doch eigentlich auf eine Datenbank beim ASP.NET-Hoster verzichten und stattdessen die die Datenbank von meinem Hosteurope-Webspace benutzen!?

Oder gibts irgendwelche Sicherheitsrichtlinien, die sowas nicht erlauben?

ravel

27.08.2008 - 19:28 Uhr

Hi,

wie legt ihr eigentlich den Abstand zwischen Controls im Designer fest? Visual Studio gibt einem ja Hilflinien vor und dockt Controls beim Verschieben auf der Form an andere Controls an (mit einem gewissen Abstand dazwischen).

Manchmal passt mir dieser Abstand aber nicht und sollte etwas größer sein.

Speziell geht es mir um die Anordnung von Label und darunterliegender Textbox. Die Labels dienen als Beschriftung der Textboxen. Dort passt der automatische Abstand ganz gut. Doch darunter will ich noch so eine Label-Textbox-Anordnung setzen. Der Abstand zwischen beiden Label-Textbox-Combos soll natürlich größer sein als der Abstand zwischen Label und zugehöriger Textbox.

Gibts vielleicht eine Tastenkombination mit der man den Rasterabstand vergrößern kann? Z.B. halte ich STRG gedrückt und das Control dockt nicht mit einem Abstand von 10px sondern 20px an ein Control an.

Ich benutze Visual Studio 2008 Express C#.

edit: Ich seh grade, dass man eine Raster-Funktion aktivieren kann. Die ist schonmal sehr nützlich, doch vermisse ich dann diese Linien-Funktion (snapToLine). Toll wäre es, wenn man sie mit einer Funktionstaste kurzzeitig umschalten kann beim Verschieben eines Controls.

ravel

30.07.2008 - 12:00 Uhr

Hi,

ich habe eine Funktion OpenWebsite. Diese Funktion öffnet in einem Webbrowser-Control eine Website und soll zurückgeben, ob das öffnen der Seite geklappt hat. Ich fange 2 Fälle ab: Timeout beim Seitenaufruf und Fehler beim Seitenaufruf wie z.b. Fehler 404).

Hier erstmal ein Codeschnippsel:

public Form1()
        {
            InitializeComponent();
            //goback aufrufen, damit activexinstace nicht null ist (wie macht man es richtig?)
            wbWeb.GoBack();            
            axBrowser = (SHDocVw.WebBrowser)wbWeb.ActiveXInstance;
            axBrowser.NavigateError += new SHDocVw.DWebBrowserEvents2_NavigateErrorEventHandler(axBrowser_NavigateError);
        }

        
        void axBrowser_NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel)
        {
            //fehler. z.b. error 404
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenWebsite("http://www.live.com");
        }

        public bool OpenWebsite(string URL)
        {
            wbWeb.Navigate(URL);
            DateTime datStart = DateTime.Now;

            while (wbWeb.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
                System.Threading.Thread.Sleep(50);
                //timeout
                if (DiffSeconds(DateTime.Now, datStart) >= Timeout)
                {
                    wbWeb.Stop();
                    return false;
                }
            }
            return true;
        }

Ich möchte gerne per Rückgabewert prüfen, ob der Webseitenaufruf geklappt hat. Den Timeout überprüfe ich mit einer Schleife und durchs Abfragen des ReadyState-Wertes des Webbrowser-Controls. Das klappt gut.

Wie bekomme ich es aber nun hin, dass meine OpenWebsite-Funktion ein false zurückliefert, wenn ein Fehler aufgetreten ist? Die einzige Möglichkeit, die ich kenne, ist das axBrowser_NavigateError zu nutzen.
Ich würde aber lieber die OpenWebsite-Funktion ein false zurückliefern lassen anstatt auf ein Event zu reagieren. Dann hab ich alles einheitlich und muss nicht auf 2 verschiedene Events reagieren.

Wie kann man sowas lösen?

  1. Frage: Beim Aufruf dieser Zeile axBrowser = (SHDocVw.WebBrowser)wbWeb.ActiveXInstance; ist ActiveXInstance noch null. Das ändert sich erst, wenn man wbWeb eine Seite öffnen lässt oder z.B. GoBack() aufruft (das kleinere Übel). Aber wie initialisiert man es richtig?

Danke und Gruß,
ravel

25.07.2008 - 08:25 Uhr

ok, danke. dann merk ich mir einfach die letzten werte in einem objekt.

MrLeeh: Kann wohl sein, dass man dort an die URL ran kommt. Ich brauche aber noch viel mehr Informationen, die in dem Event gar nicht übergeben werden. Ich hab mein Beispiel nur auf das Wesentliche beschränkt, nämlich URL.

Danke für Eure Hilfe!

24.07.2008 - 23:11 Uhr

Hi,

so eine Klasse habe ich mir bereits deklariert und ich löse sie aus, wenn ein Webseitenaufruf geklappt hat. Nur kommt es manchmal vor, dass das Event axBrowser_NavigateError aufgerufen wird. Dort weiß ich aber nicht von meinen Daten wie z.B. URL, außer ich setze Sie auf public.

Das Event, was ich hier anschließe, hab ich nicht selbst geschrieben, sondern kommt aus der WebBrowser-Klasse von SHDocVw:

SHDocVw.WebBrowser axBrowser = (SHDocVw.WebBrowser)wbWeb.ActiveXInstance;
            axBrowser.NavigateError += new SHDocVw.DWebBrowserEvents2_NavigateErrorEventHandler(axBrowser_NavigateError);

Kann ich dieses Event denn irgendwie überladen oder erweitern?

24.07.2008 - 22:20 Uhr

Hi,

ich habe eine Funktion, die ein Webbrowsercontrol dazu bringt, eine Website anzusteuern. Ich nutze folgenden Codeschnipsel um Fehlercodes vom Webbrowser-Control abzufangen:

        private void ZeigeSeite(string URL)
        {
            SHDocVw.WebBrowser axBrowser = (SHDocVw.WebBrowser)wbWeb.ActiveXInstance;
            axBrowser.NavigateError += new SHDocVw.DWebBrowserEvents2_NavigateErrorEventHandler(axBrowser_NavigateError);
        }

Dadurch wird folgendes Event ausgelöst:

        void axBrowser_NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel)
        {
//hier möchte ich z.b. wissen, was in URL stand
        }

Ich möchte im Event axBrowser_NavigateError gerne mitkriegen, welche URL angesurft wurde.

Wie mach ich das am besten?

18.06.2008 - 23:37 Uhr

Hi,

ich versuche grade parallel mehrere Webbrowser-Control-Instanzen mit verschiedenen Proxies zu benutzen.
Ich habe im Internet schon ein Snippet gefunden, mit dem man für ein Webbrowser-Control ein Proxy einstellt, ohne in der Registry rumpfuschen zu müssen.

Hier mein Code:


        private void Form1_Load(object sender, EventArgs e)
        {
            RefreshIESettings("202.106.16.36:3128");
            webBrowser1.Navigate("http://www.wieistmeineip.de");

            RefreshIESettings("207.232.27.12:8080");
            webBrowser2.Navigate("http://www.wieistmeineip.de");
        }

        [DllImport("wininet.dll", SetLastError = true)]
        private static extern bool InternetSetOption(IntPtr hInternet,
        int dwOption,
        IntPtr lpBuffer,
        int lpdwBufferLength);
       
        struct Struct_INTERNET_PROXY_INFO
        {
            public int dwAccessType;
            public IntPtr proxy;
            public IntPtr proxyBypass;
        };

        private void RefreshIESettings(string strProxy)
        {
            const int INTERNET_OPTION_PROXY = 38;
            const int INTERNET_OPEN_TYPE_PROXY = 3;

            Struct_INTERNET_PROXY_INFO struct_IPI;

            // Filling in structure
            struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
            struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy);
            struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");

            // Allocating memory
            IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));

            // Converting structure to IntPtr
            Marshal.StructureToPtr(struct_IPI, intptrStruct, true);

            bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI));
        }

Das Verhalten ist nun folgendes: Beide Webbrowser benutzen den zweiten Proxy, der mit RefreshIESettings gesetzt wurde.

Wie bewerkstellige ich es, dass parallel 2 Webbrowsercontrols Webseiten mit verschiedenen Proxies aufrufen?

Danke und Gruß,
ravel

18.04.2008 - 18:24 Uhr

Hi,

ich bin auf der Suche nach einer kostenlosen OCR-Bibliothek, die ich in .net benutzen kann. Gerne auch Open-Source.

Kennt ihr kostenlose Bibliotheken? Wenn nein, welche kostengünstige könnt ihr mir empfehlen?

16.04.2008 - 14:48 Uhr

Hi,

sollte funktionieren, wenn du das .NET Reactor Addin für Visual Studio installierst, bzw. den Reactor als Postbuild - Eregnis definierst.

Dann müsste er eigentlich vor der Veröffentlichung das ganze noch schützen.

also mit dem addin klappts zwar, aber ich bekomme es nicht hin, dass die lizesierung dann funktioniert. ich habe testweise eine 14 tage trial lizenz erstellen wollen. das ganze habe ich dann als reactor-projekt gespeichert und im reactor addin eingetragen, dass er das projekt benutzen soll. leider startet das programm auch ohne lizenz-datei. ich habe gemerkt, dass er auch gar nicht alle einstellungen in der reactor projekt-datei speichert. er speichert z.b. nicht den modus (application oder library)

das mit dem postbuild-event hat gar nicht geklappt. wenn ich den pfad zur reactor.exe beim postbuild eintrage, startet sich der .net reactor zwar, wenn ich auf "projekt erstellen" klicke, aber nachdem ich den reactor geschlossen habe, werden erst die dateien im release-ordner von VS erzeugt, wodurch die protecteten wieder überschrieben werden.

kann da noch jemand tipps?

14.04.2008 - 15:00 Uhr

ist es eigentlich irgendwie möglich seine anwendung mit .net reactor zu schützen, wenn sie per clickonce installiert wird? der reactor müsste sich ja irgendwie dazwischenschalten, zwischen das erzeugen und veröffentliches des projektes.

14.04.2008 - 10:37 Uhr

hallo herbivore,

genau so eine antwort habe ich gesucht. vielen dank.

kannst du mir mal kurz erklären, was du mit synchronisierter queue meinst? in meiner quick & dirty-lösung habe ich auch eine query. ich benutze einfach eine arraylist, in der die webseiten stehen, die einzelnen threads holen sich immer einen eintrag aus der arraylist und löschen den eintrag dann aus der arraylist.

hier MSDN Synchronized Queue wird beschrieben, wie man es benutzt. ich denke mal der sinn dahinter ist, dass nicht ein thread ein element aus der auflistung entfernt und der andere thread im gleichen moment aber auf dieses element zugreifen möchte, richtig?

eine boolsche stop-variable habe ich bereits in meiner quick&dirty lösung verwendet. dort ist aber aber oft der fall (wenn der timeout für den webseitenzugriff hoch gewählt ist), dass das beenden sehr lange dauert, wenn der thread bereits gestartet wurde und die webseite aufruft.
kann ich nicht, wie oben beschrieben, einfach die threads brutal beenden mit thread.abort()?

13.04.2008 - 22:42 Uhr

Hi,

ich habe eine Anwendung, die den Status von Webseiten abfragt. Es wird also eine große Liste mit webseiten angegeben, welche das programm auf erreichbarkeit überprüft. im programm kann man angeben, wieviele seiten parallel abgefragt werden sollen (threads).

ok, das programm ist bereits fertig und funktioniert. aber quick & dirty. jetzt möchte ich es gerne nochmal sauber programmieren und etwas erweitern.

ich bräuchte eine klasse, die eine methode hat, die ge-threaded aufgerufen wird, diese soll events auslösen (eines bei erfolg und eines bei exception). die events geben dann entweder eine erfolgsmeldung zurück oder die exeception. zusätzlich sollte man festlegen können, wieviele threads parallel laufen dürfen. es muss auch noch möglich sein, alle threads zu beenden, wobei ich nicht weiß, wie das geht. eventuell referenzen aller laufenden threads in einer arraylist merken und diese dann beim abbruch durchlaufen und stoppen?

ich bräuchte mal ein grob-konzept, wie man solche vorhaben am besten löst. gibt es vielleicht ein entwurfsmuster oder eine vorlage, die beschreibt, die man sowas ideal löst?

13.04.2008 - 19:27 Uhr

könntest du dem entwickler ja mal zukommen lassen. verbesserungsvorschlägen gegenüber ist er offen. support@eziriz.com ist die adresse.

zwar wird er diese erkenntnisse ja selbst schon haben, schließlich hat er das ding programmiert, aber wenn ihn kunden drauf hinweisen, macht er evtl. auch was.

13.04.2008 - 17:13 Uhr

leider sehr unbefriedigend. der hersteller hat immer noch keine lösung dafür, trotz mehrerer anfragen und detaillierter problembeschreibung.
Antworten die dir wenigstens?
Habe dort schon zwei Supportanfragen hingeschickt und nicht eine Antwort erhalten.

Beste Grüße, Max

bisher hat er (scheint ne 1-mann-firma zu sein) immer innerhalb kurzer zeit geantwortet. bei meinem jetzigen problem mit dem custom-settings-provider hat er seit über 1 woche nicht geantwortet.

wann hast du ihm ne mail geschrieben? vielleicht ist er ja einfach nur verhindert, weil er im urlaub ist oder krank. bisher hat er nicht den eindruck gemacht, sich vor den problemen drücken zu wollen. der support ist eigentlich sehr gut. nur leider scheitert es immer noch an meinen beiden beschriebenen problemen. und dafür hat er noch keine befriedigende lösung.

was mich jetzt aber sehr verunsichert ist, dass das der .net reactor laut Kalleberlins aussage sehr unsicher sei. kommt man wirklich so einfach an die strings im geschützten zustand? ist der gesamte quellcode auch wieder einsehbar?

13.04.2008 - 16:49 Uhr

ich habe mir auch den .net reactor zugelegt.

ich bin leider schon auf 2 einschränkungen gestoßen im application-modus.

  • es gibt fehler, wenn man eine windows-anwendung im application-modus schützen will, die auf einen webservice zugreift.

  • es gibt fehler, wenn man eine windows-anwendung im application-modus schützen will, die einen eigenen settings provider benutzt.

es gibt 2 workarounds dafür: die anwendung im library-modus schützen oder, fehlerverursachenden stellen (also zugriff auf webservice und zugriff auf settingsprovider) in Dlls auslagern und getrennt schützen.

leider sehr unbefriedigend. der hersteller hat immer noch keine lösung dafür, trotz mehrerer anfragen und detaillierter problembeschreibung.

13.04.2008 - 16:18 Uhr

würde mich auch mal interessieren, ob und wie man den beim webbrowser-control ändern kann.

11.04.2008 - 18:17 Uhr

Hi,

ich benutze einen eigenen SettingsProvider (basiert auf diesem hier, ist aber angepasst: http://www.codeproject.com/KB/vb/CustomSettingsProvider.aspx).

Dieser ist bisher eine Klasse, die zu meinem Projekt gehört. D.h. ich kann dort einfach von Application.ProductName gebrauch machen. Ich möchte nun gerne den SettingsProvider gerne in eine Dll auslagern. Mein Problem ist, dass ich in der Dll nicht weiß, wie der ProductName der aufrufenden Assembly ist.

Wenn ich weiß, wie die Dll aufgerufen wird, könnte ich den Application.ProductName ja dem Dll-Aufruf übergeben. Der Dll-Aufruf findet für mich gewissermaßen unsichtbar statt. Ich benutze die Settings ganz normal, wie ohne eigenen SettingsProvider.

Kann man irgendwie an den Namen der aufrufenden Assembly kommen?

EDIT: Ich frage mich grade, ob es überhaupt geht, einen SettingsProvider in eine Dll zu stecken. Hat das schonmal jemand gemacht?

Danke!

05.04.2008 - 23:15 Uhr

Hi,

ich möchte mittels httpWebRequest eine Website parsen. Leider werden teile der Website erst durch Javascript sichtbar.
Im WebResponse sehe ich also leider u.A. nur die Meldung "Sie müssen zuerst Javascript aktivieren".

Da Javascript vom Browser interpretiert wird, befürchte ich fast, dass ich mehr als nur httpWebrequest/Reponse benötige um Javascript auszuführen, oder?

Gibt es vielleicht eine andere Möglichkeit um Scripte auf den Website auszuführen, bevor ich mir den Inhalt der Website hole? Ich sehe momentan nur die Möglichkeit stumpf das Webbrowser-Control zu benutzen. Wovon ich eigentlich ungern gebrauch machen möchte, weil ich dadurch einige Sachen gar nicht machen kann. z.B. parallele Verbindungen zu Websites über Proxies (man kann nur ein Proxy für das Webbrowser-Control per Registry einstellen).

Wäre schön, wenn mir jemand Ratschläge geben könnte.