Nejčastěji odpovídající uživatel
Vlastni webova komponenta

Dotaz
-
Dobry den,
mam problem s Webovou componentou. Potrebuji vytvorit komponentu (je mi celkem jedno jestli to bude WebControl nebo UserControl), kterou budu moci vyuzivat tak, ze mezi begin a end tag budu moct vlozit jakykoliv dalsi ovladaci prvek, napr. tedy
<%@ Register assembly="tblWeb" namespace="myComponentsLib" tagprefix="my" %>
<my:tblWeb ID="tblWeb1" runat="server" Icon="list" Title="tomik" Width="600">
<asp:GridView ID="grdVW1" runat="server" />
</my:tblWeb>
V soucasne chvili mi komponenta funguje pouze kdyz nemam mezi begin a end Tagem nic. Nevite nekdo v cem jsem udelal chybu?
CS kod komponenty je
public class TblWeb : WebControl, INamingContainer
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
}
set
{
ViewState["Text"] = value;
}
}
private String icon;
private String title;
private Int32 width;
public TblWeb()
{
this.icon = "";
this.width = 150;
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<table ... >");
writer.Write("<tr>");
writer.Write("<td>...</td>");
}
}
public override void RenderEndTag(HtmlTextWriter writer)
{
writer.Write("</td></tr></table>");
}
protected override void RenderChildren(HtmlTextWriter writer)
{
base.RenderChildren(writer);
}
public String Icon
{
get { return icon; }
set { icon = value; }
}
public String Title
{
get { return title; }
set { title = value; }
}
}
Moc diky za pomoc.
Jindraneděle 7. března 2010 13:51
Odpovědi
-
V první řadě vyhoďte ten override metody Render(), kterým si zabíjíte volání RenderBeginTag(), RenderContents() i RenderEndTag().
Pokud byste se do toho chtěl pustit hlouběji, tak se podívejte na význam atributů ControlBuilderAttribute, popř. ParseChildrenAttribute, popř. na zdrojový kód controlu PlaceHolder, nebo Panel.
http://msdn.microsoft.com/en-us/library/aa310907(VS.71).aspx
Robert Haken, Microsoft MVP ASP/ASP.NET, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz- Označen jako odpověď Robert HakenMVP, Moderator pondělí 8. března 2010 21:22
pondělí 8. března 2010 21:22Moderátor
Všechny reakce
-
V první řadě vyhoďte ten override metody Render(), kterým si zabíjíte volání RenderBeginTag(), RenderContents() i RenderEndTag().
Pokud byste se do toho chtěl pustit hlouběji, tak se podívejte na význam atributů ControlBuilderAttribute, popř. ParseChildrenAttribute, popř. na zdrojový kód controlu PlaceHolder, nebo Panel.
http://msdn.microsoft.com/en-us/library/aa310907(VS.71).aspx
Robert Haken, Microsoft MVP ASP/ASP.NET, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz- Označen jako odpověď Robert HakenMVP, Moderator pondělí 8. března 2010 21:22
pondělí 8. března 2010 21:22Moderátor -
Místo vlastnosti public string Text bych raději použil public ITemplate InnerElement a oznacovat ji jako Bindable a Localizable je podle mě dost nevhodné.
Jednoduchý návod jak dělat Templatovatelné kontrolky: http://msdn.microsoft.com/en-us/library/36574bf6.aspxMimochodem, jak uvádíte v příkladu, použít uvnitř GridView, nebo jinou podobně rozsáhlou kontrolku může způsobovat její neobvyklé chování. Z vlastní zkušenosti vím, že kontroky pracujici s ViewStatem, ControlStatem a implementující rozhraní INamingContainer, ICallbackEventHandler či IPostbackEventHandler není příliš vhodné umisťovat do vlastních kontrolek. K zaručení jejich plné funkčnosti, je potřeba znát ASP.NET velmi do hloubky.
pondělí 27. prosince 2010 9:48