begin process at 2008 08 30 17:03:05
1 234 125 membres
158 nouveaux aujourd'hui
14 294 membres club

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 !

Sujet : [.NET 2.0] Problème avec VS2005 [ Archives ASP & ASP.NET / AU SECOURS !!!! ] (stailer)

[.NET 2.0] Problème avec VS2005 le 14/12/2005 16:05:28

stailer
Bonjour,

En asp.net 1.1 j'avais une classe comme ceci :

[code]
namespace MonAppli
    {
        public class Formulaire : System.Web.UI.HtmlControls.HtmlForm
        {

            protected override void RenderAttributes(HtmlTextWriter writer)
            {
                base.RenderAttributes(writer);

                writer.WriteAttribute("name", this.Name);
                base.Attributes.Remove("name");

                writer.WriteAttribute("method", this.Method);
                base.Attributes.Remove("method");

                base.Attributes.Remove("action");

                this.Attributes.Render(writer);

                if (base.ID != null)
                    writer.WriteAttribute("id", base.ClientID);
            }

        }
    }
[/code]

Elle me permettait de modifier les attributs de la balise form, difficilement accessible (Attributes.Remove ne fonctionnant pas..) et donc de l'appeler dans une page aspx de cette façon :

[code]
<%@ Register TagPrefix="st" Namespace="MonAppli"%>

<st:Formulaire id="Form1" runat="server">
[/code]

Le problème avec VS2005 c'est que je ne vois plus mes composants dans le formulaire (dans le designer) ! Il m'affiche une erreur à la place :

Form1:Unable to cast object of type 'System.Web.UI.Design.HtmlIntrinsicControlDesigner' to type 'System.Web.UI.Design.ControlDesigner'.   

Quelqu'un saurait ce que je dois modifier ? Car je compte développer d'autres classes du même type... Et le fait de ne pas voir les composants dans le desisgner est un gros souci.

En vous remerciant,

<--St@iLeR-->

Re : [.NET 2.0] Problème avec VS2005 le 14/12/2005 17:30:12

jesusonline
Membre Club
(Admin CS)
Quand j'avais ce genre de poblème je me servais de reflector pour regarder comment fonctionne le controle htmlform de base.

A mon avis c'est un problème de designer, mais la reflector est ton ami ;)

au pire je pourrais t'aider =)


Cyril - MVS - MCP ASP

Re : [.NET 2.0] Problème avec VS2005 le 15/12/2005 04:40:03

stailer
Salut,

effectivement, tu vas pouvoir m'aider : (

Je comprends pas vraiment , j'ai cherché partout sur la msdn.
Apparemment il faudrait déclarer un truc comme ça avant la classe :

[Designer... ControlDesigner)]
public class Form : ..HtmlForm

Mais ça ne foncionne pas.
J'ai lu qu'il faudrait hériter de la classe ControlDesigner ou du moins en modifier l'interface pour la
transformer en HtmlIntrinsicControlDesigner. Ou l'inverse , j'ai pas vraiment compris.

Merci pour ton aide, because je suis dans le brouillard complet.

<--St@iLeR-->

Re : [.NET 2.0] Problème avec VS2005 le 15/12/2005 10:08:48

jesusonline
Membre Club
(Admin CS)
Malheureusement j'ai pas le temps de t'aider :s

oui c'est bien avec un attribut et bien avec un designer regarde dans reflector comment ca fonctionne, c'est tout ce queje peux dire


Cyril - MVS - MCP ASP<

Re : [.NET 2.0] Problème avec VS2005 le 26/12/2005 16:15:30

stailer
Petite avancée, en faisant ceci :

internal class MyControlDesigner : System.Web.UI.Design.ControlDesigner
    {
        public MyControlDesigner() { }

       public override string GetDesignTimeHtml()
       {
            return this.CreatePlaceHolderDesignTimeHtml();
       }

        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
        }
    }


et donc :

[DesignerAttribute(typeof(MyControlDesigner)) ]
    public class form : System.Web.UI.HtmlControls.HtmlForm {...}

Je n'ai plus la même erreur , mais :

Duplicate component name 'Form1'. Component names must be unique and case-insensitive.

Si je change le nom, avec Form2 par exemple, l'erreur est toujours la même. C'ets vraiment pénible ce problème, surtout que je voudrais développer d'autres composants de ce type. J'en profite donc pour remonter ce souci, en espérant avoir une petite aide...

Merci,

Re : [.NET 2.0] Problème avec VS2005 le 26/12/2005 16:33:12

jesusonline
Membre Club
(Admin CS)

J'ai un peu de temps pour t'aider ;)
J'ai pas créer de controle form mais un controle container que voici

namespace CSLib.Web.UI.CSControls
{
    /// <summary>
    /// Un Container possede un titre et du contenu
    /// </summary>
    [ToolboxData(@"<{0}:Container runat=""server""></{0}:Container>"),
    ParseChildren(false),
    PersistChildren(true),
    Designer(typeof(Design.ContainerDesigner))]
    public class Container : CSLib.Web.UI.CSControls.CSControl
    {
        [Description("Title"),
        Browsable(true)]
        public string Title
        {
            get
            {
                if (ViewState["title"] != null)
                    return (string)ViewState["title"];
                else
                    return string.Empty;
            }
            set { ViewState["title"] = value; }
        }

        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write(string.Format("<div class=\"CSLib_C\" id=\"{0}\">\n", this.ClientID));
            writer.Write(string.Format("\t<div class=\"CSLib_C_T\">{0}</div>\n", this.Title));
            writer.Write("\t<div class=\"CSLib_C_C\">\n");
            base.Render(writer);
            writer.Write("\n\t</div>\n");
            writer.Write("</div>");
        }
    }
}


et le designer

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.Design;
using System.ComponentModel;
using CSLib.Web.UI;
using System.Globalization;

namespace CSLib.Web.UI.CSControls.Design
{
    public class ContainerDesigner : System.Web.UI.Design.ContainerControlDesigner
    {
        private Container _ctrl = null;
        private string _content = string.Empty;

        public override void Initialize(IComponent component)
        {
            if (component is Container)
                _ctrl = (Container)component;
            else
                throw new Exception("Bad Control");

            base.Initialize(component);
        }

        public override bool AllowResize
        {
            get
            {
                return false;
            }
        }

        public override string GetDesignTimeHtml(DesignerRegionCollection regions)
        {
            EditableDesignerRegion RegionContent = new EditableDesignerRegion(this, "Content");
            regions.Add(RegionContent);

            Object[] objArray1 = new object[] { _ctrl.Title, DesignerRegion.DesignerRegionAttributeName };
            return String.Format(CultureInfo.InvariantCulture,
                    @"<div class=""CSLib_C"">" +
                    @"    <div class=""CSLib_C_T"">{0}</div>" +
                    @"    <div class=""CSLib_C_C"" {1}=""0"">rien</div>" +
                    @"</div>"
                , objArray1);
        }
    }
}


Je pense que ton problème vient de GetDesignTimeHtml, toi tu fais appel à CreatePlaceHolderDesignTimeHtml qui fait plus ou moins la meme chose :

protected string CreatePlaceHolderDesignTimeHtml(string instruction)
{
      string text1 = base.Component.GetType().Name;
      string text2 = base.Component.Site.Name;
      if (instruction == null)
      {
            instruction = string.Empty;
      }
      object[] objArray1 = new object[] { text1, text2, instruction } ;
      return string.Format(CultureInfo.InvariantCulture, ControlDesigner.PlaceHolderDesignTimeHtmlTemplate, objArray1);
}
 
 mis à part que la fonction fait appell à ControlDesigner.PlaceHolderDesignTimeHtmlTemplate, malheureusement reflector n'a pas voulu me dire ce que cela vaut :(

mais le truc c'est que les zones éditables sont une nouveautés dans VS2005 pour l'instant j'ai pas trouvé d'articles la dessus (il y a 3/4 mois), ce qu'il faut savoir c'est qu'il faut mettre un attribut ayant la valeur

DesignerRegion.DesignerRegionAttributeName étant égale à n sur l'element que tu veux editer

            Object[] objArray1 = new object[] { _ctrl.Title, DesignerRegion.DesignerRegionAttributeName };
            return String.Format(CultureInfo.InvariantCulture,
                    @"<div class=""CSLib_C"">" +
                    @"    <div class=""CSLib_C_T"">{0}</div>" +
                    @"    <div class=""CSLib_C_C"" {1}=""0"">rien</div>" +
                    @"</div>"
                , objArray1);


Je dis égale à n car on a la possibilité de mettre plusieurs zones éditables pour ensuite les recuperer plus loin :)

j'espere que ca t'aidera, sinon envoie moi un message privée et je te répondrais en te donnant mon adresse msn ce sera plus simple (on mettra bien sur la solution finale ici ;))


Cyril - MVS - MCP ASP



Classé sous : base, code, attributes, remove, writer

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS