Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

15 commentaire(s) de godvicien sur des sources sur tout CodeS-SourceS

Le : 17/05/2008 18:28:03
Source : WEB SKIN : CRÉEZ UNE INTERFACE ASPNET POUR VOTRE CLIENT LOURD DOTNET SANS IIS. HÉBERGEMENT INTERNE DE WEBAPP.
Voici le code correctif qu'il faut ajouter ? chaque page aspx qui utilise des controls avec AutoPostBack,
a mettre dans le code-behind de la page :

    /// <summary>
    /// Override: nothing.
    /// </summary>
    /// <param name="control"></param>
    public override void VerifyRenderingInServerForm(Control control)
    {
        //nothing
    }
    /// <summary>
    /// Override: call Render_WithAutoPostBack().
    /// </summary>
    /// <param name="htmlWriterResponse"></param>
    protected override void Render(HtmlTextWriter htmlWriterResponse)
    {
        this.Render_WithAutoPostBack(htmlWriterResponse);

    }
    /// <summary>
    /// Render the html of the page with AutoPostBack events.
    /// </summary>
    /// <param name="htmlWriterResponse"></param>
    protected void Render_WithAutoPostBack(HtmlTextWriter htmlWriterResponse)
    {
        //TODO: update the list of YOUR controls that have the AutoPostBack properties
        Control[] controlsWithAutoPostBack =
            new Control[] { this.ddlSemanticLangs };

        //make a new htmlTextWriter on a stringWriter
        StringWriter stringWriter = new StringWriter();
        HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);
        //render the page
        base.Render(htmlTextWriter);
        htmlTextWriter.Flush();
        string html = stringWriter.ToString();

        //add inputs hidden for AutoPostBack function
        html = html.Replace("<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE",
            "<input type=\"hidden\" name=\"__EVENTTARGET\" id=\"__EVENTTARGET\" value=\"\" />\n" +
            "<input type=\"hidden\" name=\"__EVENTARGUMENT\" id=\"__EVENTARGUMENT\" value=\"\" />\n" +
            //"<input type=\"hidden\" name=\"__LASTFOCUS\" id=\"__LASTFOCUS\" value=\"\" />\n" +
            "<script type=\"text/javascript\">\n" +
            "   var theForm = document.forms['aspnetForm'];\n" +
            "   if (!theForm) {\n" +
            "       theForm = document.aspnetForm;\n" +
            "   }\n" +
            "function __doPostBack(eventTarget, eventArgument) {\n" +
            "   if (!theForm.onsubmit || (theForm.onsubmit() != false)) {\n" +
            "       theForm.__EVENTTARGET.value = eventTarget;\n" +
            "       theForm.__EVENTARGUMENT.value = eventArgument;\n" +
            "       theForm.submit();\n" +
            "   }\n" +
            "}\n" +
            "</script>\n" +
            "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE");

        //loop to treat each control with AutoPostBack
        foreach (Control control in controlsWithAutoPostBack)
        {
            //get render of the control
            StringWriter strWriter = new StringWriter();
            HtmlTextWriter htmlWriter = new HtmlTextWriter(strWriter);
            control.RenderControl(htmlWriter);
            htmlWriter.Flush();
            string htmlControl = strWriter.ToString();
            //get id of the control
            XmlDocument xmlControl = new XmlDocument();
            xmlControl.LoadXml(htmlControl);
            string idControl = "id=\"" + xmlControl.DocumentElement.Attributes["id"].Value + "\"";
            //build onchange function
            string onchange = "onchange=\"javascript:setTimeout('" + this.GetPostBackEventReference(control).Replace("'", "\\'") + "', 0)\"";
            //affect in html
            html = html.Replace(idControl, idControl + " " + onchange);

        }//next control

        //write html in the response
        htmlWriterResponse.WriteLine(html);

    }


Comme vous pouvez le voir il suffit de mettre a jour la liste des controls qui utilisent le AutoPostBack au d?but de la fonction Render_WithAutoPostBack().



Le : 17/05/2008 13:29:56
Source : WEB SKIN : CRÉEZ UNE INTERFACE ASPNET POUR VOTRE CLIENT LOURD DOTNET SANS IIS. HÉBERGEMENT INTERNE DE WEBAPP.
Je viens de d?couvrir un gros bug : ce system ne g?n?re pas le code 'AutoPostBack' des controls serveur ASP.

Pourquoi ? Myst?re ...


Le : 16/05/2008 08:08:38
Source : WEB SKIN : CRÉEZ UNE INTERFACE ASPNET POUR VOTRE CLIENT LOURD DOTNET SANS IIS. HÉBERGEMENT INTERNE DE WEBAPP.
MAJ V4:

J'ai ajouté quelques fonctionnalités indispensables :
- Gestion des sous-repertoires de la WebApp (dont App_GlobalRessources)
- Gestion des fichiers Non-ASP (images, css, html)


A part ca j'ai découvert que l'on pouvait débuguer la WebApp avec ce server comme pour une WebApp sous IIS.
C'est magique, il suffit d'inserer un point d'arret dans une page web.


Le : 12/05/2008 14:44:33
Source : WEB SKIN : CRÉEZ UNE INTERFACE ASPNET POUR VOTRE CLIENT LOURD DOTNET SANS IIS. HÉBERGEMENT INTERNE DE WEBAPP.
@Warny: Exact ! On peut tout a fait concevoir une interface d'administration à distance (par internet) du client lourd.

J'ai fais le teste à l'instant, ca fonctionne en réseau local (pas essayé par internet). Il suffit d'indiquer l'ip de la machine sur le formulaire de la V3. Le serveur écoute alors tout les requêtes du réseau. Reste qu'il me semble que les box-internet modernes masquent l'ip de la machine sur internet. Faut donc faire quelques testes.

J'ai donc mis à jour la source pour vous donner la version finale qui intègre une dll (ServerASPNET.dll) qu'il faut simplement placer dans le répertoire /bin/ de votre WebApp. Et d'instancier ensuite la classe 'ServerASPNET' dans votre client lourd.

Vous pouvez maintenant mettre une note à mon code...


Le : 08/05/2008 10:50:32
Source : WEB SKIN : CRÉEZ UNE INTERFACE ASPNET POUR VOTRE CLIENT LOURD DOTNET SANS IIS. HÉBERGEMENT INTERNE DE WEBAPP.
Alors, tu n'échangerais pas ton baril de WinForms contre mon baril de WebForms, sans même avoir essayé ?
Je crois que pour dire ca tu n'as pas de clients à satisfaire, ou alors tu es un pro des WinForms. Car, pour mon application, la skin de base est une WinForm, et à chaque fois c'est la même remballe : C'est condensé, riche, complexe, bref peu-lisible pour quelqu'un  qui n'a pas été spécialement formé à l'interface.

La philosophie d'un client lourd ou client riche, à base de WinForms, est d'être très puissant en offrant un maximum de fonctionnalités sur chaque formulaire. Mon formulaire principale cumule les fonctions de :
- champs de recherches
- listings de résultats
- consultation de fiches
- création de fiches
Tout ca sur le même formulaire, alors qu'en WebApp il y aurait une page par fonctionnalité. Pour être franc les WinForms ont vite tendance à devenir de véritables usines à gaz qui concentrent trop de fonctionnalités. Les utilisateurs de base ne sont pas habitués à autant de fonctionnalités, ils préfèrent une navigation claire par page dans un navigateur Web. Je n'ai pas l'intention de former tous mes utilisateurs donc je décide de me lancer dans l'aventure...

Au fait je précise que malgrès l'utilisation des Visual Express 2008 le projet est compilé pour le Framework .Net 2.0, donc il est possible d'ouvrir les fichiers solution du projet avec Visual Studio 2005 en changeant simplement la version de ces fichiers .sln (textes).

Si vous recompilez le tout n'oubliez pas de mettre une copie de ServerLocalASPNET.exe (ou .dll) dans le dossier /bin/ de l'application, car c'est la que cherchera la fonction de création du Host Server. Il doit y trouver la classe 'ServerLocalASPNET'.


Le : 07/05/2008 11:50:50
Source : WEB SKIN : CRÉEZ UNE INTERFACE ASPNET POUR VOTRE CLIENT LOURD DOTNET SANS IIS. HÉBERGEMENT INTERNE DE WEBAPP.
Arf. J'ai complètement oublier de dire que ce code ne fonctionne pas sous Windows Vista, qui bloque l'utilisation du HttpListener, visiblement pour des question de sécurité. Il doit y avoir un bout de code à rajouter pour cela fonctionne sous Vista, mais lequel ??

Si quelqu'un trouve la solution pour faire marcher cet exemple sous Vista, je pourrai être très gratifiant (je serais même prêt à payer, c'est vous dire).

De même si quelqu'un trouve la solution pour faire fonctionner cet exemple avec Firefox...


Le : 18/04/2008 12:27:47
Source : SÉRIALISATION XML D'UN DICTIONARY
Très bon code, je mets 8/10.


Le : 17/03/2008 15:22:11
Source : OUVRIR DES DOCUMENTS DANS LA MÊME INSTANCE DE L'APPLICATION SANS RELANCEMENT DE L'EXE (DDE) EN .NET
Bon il me reste en effet un ultime bug de première ouverture de fichier.
On dirait que ca viens de l'OS.

Sinon j'ai une petite question : Ca sert à quoi ca :
_ddeListener.SubClass = true/false;

Ca veut dire quoi : "définit ou renvoie l'état du subclassing de la form" ??


Le : 16/03/2008 16:12:34
Source : OUVRIR DES DOCUMENTS DANS LA MÊME INSTANCE DE L'APPLICATION SANS RELANCEMENT DE L'EXE (DDE) EN .NET
Excellent !

Tout fonctionne sur mon soft, le transfert c'est fait sans problème.

En ce qui concerne la class EXTAssociation je la trouve très lourde, le framework .NET permet de manipuler les clés de registre beaucoup plus facilement.

Alors pour la remplacer il faut créer votre classe et bien suivre ce schéma de la base de registre :
(que vous pouvez stocker dans un fichier .reg, c'est ce que je fais pour outrepasser les droits de vista)
Il suffit de remplacer 'ed2k' par votre extension '.xyz'. En effet on peut créer son propre type de liens comme dans cette exemple :

[FichierTexte.reg]
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\ed2k]
@="URL: ed2k Protocol"
"URL Protocol"=""
; cette ligne précédente est indispensable pour créer un protocole style "ed2K://votre_URL"

[HKEY_CLASSES_ROOT\ed2k\DefaultIcon]
@="C:\\Program Files\\eMule\\eMule.exe,0"

[HKEY_CLASSES_ROOT\ed2k\shell]
@="open"

[HKEY_CLASSES_ROOT\ed2k\shell\open]

[HKEY_CLASSES_ROOT\ed2k\shell\open\command]
@="\"C:\\Program Files\\eMule\\eMule.exe\" \"%1\""

[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec]
@="[peeurl(\"%1\")]"

[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec\Application]
@="eMule.exe"

[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec\Topic]
@="P2P"

[/FichierTexte.reg]

Et lancer l'écoute des messages DDE avec ce code dans votre FormMain.Load() :

_ddeListener = new DDEListener(this.Handle, "eMule.exe", "P2P");
_ddeListener.OnReceiveCommand += new DDEListener.OnReceiveCommandDelegate(DDEListener_OnReceiveCommand);
_ddeListener.SubClass = true;

Et dans votre FormMain.Closing :
_ddeListener.SubClass = false;        

Voila j'espère avoir bien résumer le tout. Un grand merci pour cette source parfaitement documentée.



Le : 15/03/2008 22:43:39
Source : OUVRIR DES DOCUMENTS DANS LA MÊME INSTANCE DE L'APPLICATION SANS RELANCEMENT DE L'EXE (DDE) EN .NET
Excellent code. C'est exactement ce qu'il me fallait ;-)

Sur vista la classe EXTAssociation ne fonctionne pas. Surement du aux nouveaux droits d'accès à la base de registre.

Sinon en effet le premier double clic sur un fichier .xyz ouvre le soft, mais comme celui ci ne gére pas les lignes de commande il n'affiche pas de "open 1 params. nom_du_fichier.xyz".

Y aurait-il un bug de trouvage de fichier *.exe "%1" ??




1


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.