none
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.
    Jindra
    7. března 2010 13:51

Odpovědi

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
    8. března 2010 21:22
    Moderá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.aspx

    Mimochodem, 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.

    27. prosince 2010 9:48