[.NET 2.0] Problème avec VS2005

cs_stailer Messages postés 507 Date d'inscription jeudi 28 mars 2002 Statut Membre Dernière intervention 13 mai 2009 - 14 déc. 2005 à 16:05
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 - 26 déc. 2005 à 16:33
Bonjour,



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




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);

            }



        }

    }





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 :




<%@ Register TagPrefix="st" Namespace="MonAppli"%>



<st:Formulaire id="Form1" runat="server">





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-->

5 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
14 déc. 2005 à 17:30
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 =)


<HR>
Cyril - MVS - MCP ASP
0
cs_stailer Messages postés 507 Date d'inscription jeudi 28 mars 2002 Statut Membre Dernière intervention 13 mai 2009 1
15 déc. 2005 à 04:40
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-->
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
15 déc. 2005 à 10:08
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


<HR>
Cyril - MVS - MCP ASP<
0
cs_stailer Messages postés 507 Date d'inscription jeudi 28 mars 2002 Statut Membre Dernière intervention 13 mai 2009 1
26 déc. 2005 à 16:15
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,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
26 déc. 2005 à 16:33
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("
\n", this.ClientID));
writer.Write(string.Format("\t
{0}
\n", this.Title));
writer.Write("\t
\n");
base.Render(writer);
writer.Write("\n\t
\n");
writer.Write("
");
}
}
}

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,
@"
" +
@"
{0}
" +
@"
rien
" +
@"
"
, 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,
@"
" +
@"
{0}
" +
@"
rien
" +
@"
"
, 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 ;))


<HR>
Cyril - MVS - MCP ASP
0
Rejoignez-nous