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