Creating LinkButtons in a Repeater ... in code.

Ask a Question related to ASP.NET Building Controls, Design and Development.

  1. #1

    Default Creating LinkButtons in a Repeater ... in code.

    Hi,
    I'm trying to create a variable number of LinkButtons using an ItemTemplate
    within a Repeater control. This is being done from code ...

    I am trying to recreate something similar to the following ... which is in a
    user control, only I'm doing it in a web part:
    <ul id="middlenavigationMenu" runat="server">
    <asp:Repeater ID="rptContractList" runat="server"
    OnItemCommand="rptContractList_ItemCommand">
    <ItemTemplate>
    <li id="middlenavigationMenuListItem" runat="server">
    <asp:LinkButton ID="lkbContractList" runat="server"
    PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "PostBackUrl") %>'
    Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
    CommandArgument='<%# DataBinder.Eval(Container.DataItem, "CommandArgument")
    %>'>
    </asp:LinkButton>
    </li>
    </ItemTemplate>
    </asp:Repeater>
    </ul>

    THE ISSUE is. that when the web page is being rendered, the <%# bits don't
    do anything ... they seem to be rendered as tezt (in the html page) and
    therefore ignored in the page output ...
    the end result is that although I get some listitems ... there is no
    LinkButton???

    Where am I going wrong ... ???

    thanks
    Wozza

    =====

    My code is below:


    protected override void CreateChildControls()
    {
    ....
    // Test LinkButton !!!
    linkButtonRepeater = new Repeater();
    linkButtonRepeater.ItemTemplate = new
    LinkButtonItemTemplate(ListItemType.Item);
    HtmlGenericControl linkButtonUl = new HtmlGenericControl(@"ul");
    linkButtonUl.Controls.Add(linkButtonRepeater);
    this.placeHolderTop.Controls.Add(linkButtonUl);
    // Test LinkButton !!!
    ....
    }


    protected override void Render(HtmlTextWriter writer)
    {
    ....
    // Test LinkButton !!!
    DataTable dt = new DataTable();
    // Define the columns of the table.
    dt.Columns.Add(new DataColumn("PostBackUrl", typeof(String)));
    dt.Columns.Add(new DataColumn("Text", typeof(String)));
    dt.Columns.Add(new DataColumn("CommandName", typeof(String)));
    dt.Columns.Add(new DataColumn("CommandArgument", typeof(String)));
    DataRow dr;
    dr = dt.NewRow();
    dr[0] = @"http://www.google.com";
    dr[1] = @"!!! PRESS ME !!!";
    dr[2] = @"XXX";
    dr[3] = @"http://linkupv2.external/pages/productpicker.aspx";
    dt.Rows.Add(dr);
    dr = dt.NewRow();
    dr[0] = @"http://www.bbc.co.uk";
    dr[1] = @"!!! PRESS ME !!!";
    dr[2] = @"XXX";
    dr[3] = @"http://linkupv2.external/pages/productpicker.aspx";
    dt.Rows.Add(dr);
    DataView dv = new DataView(dt);
    linkButtonRepeater.DataSource = dv;
    linkButtonRepeater.DataBind();
    linkButtonRepeater.ItemCommand += new
    RepeaterCommandEventHandler(linkButtonRepeater_Ite mCommand);
    // Test LinkButton !!!
    ....
    }


    namespace TestWebPart
    {
    /// <summary>
    /// <example>
    ///<ItemTemplate>
    /// <asp:LinkButton runat="server" ID="xxx" PostBackUrl="Default.aspx"
    /// Text='<%# DataBinder.Eval(Container.DataItem, "TextNameField") %>'
    /// CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    "CommandArgumentField") %>'
    /// >
    /// </asp:LinkButton>
    ///</ItemTemplate>
    /// </example>
    /// </summary>
    public class LinkButtonItemTemplate : ITemplate
    {
    static int itemcount = 0;
    static string controlNamePrefix = Guid.NewGuid().ToString();
    ListItemType templateType;
    public LinkButtonItemTemplate(ListItemType type)
    {
    templateType = type;
    }

    // <asp:LinkButton ID="linkButtonList" runat="server"
    // PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "PostBackUrl") %>'
    // Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
    // CommandName='<%# DataBinder.Eval(Container.DataItem, "CommandName") %>'>
    // CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    "CommandArgument") %>'>
    // </asp:LinkButton>
    public void InstantiateIn(System.Web.UI.Control container)
    {
    Literal lc = new Literal();
    switch (templateType)
    {
    case ListItemType.Header:
    throw new ArgumentException(@"This template type is not designed for use in
    a header.");
    break;
    case ListItemType.Item:
    lc.Text = String.Format
    (
    @"<li id=""li{0}{1}"" runat=""server"">"
    + @"<asp:LinkButton runat=""server"" ID=""{0}{1}"""
    + @" PostBackUrl='<%# DataBinder.Eval(Container.DataItem, ""PostBackUrl"")
    %>'"
    + @" Text='<%# DataBinder.Eval(Container.DataItem, ""Text"") %>'"
    + @" CommandName='<%# DataBinder.Eval(Container.DataItem, ""CommandName"")
    %>'"
    + @" CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    ""CommandArgument"") %>'"
    + @">{0}{1}</asp:LinkButton>"
    + @"</li>"
    , controlNamePrefix
    , itemcount
    );
    lc.Text = String.Format
    (
    @"<li id=""li{0}{1}"" runat=""server"">"
    + @"<asp:LinkButton runat=""server"" ID=""{0}{1}"""
    + @" PostBackUrl=""HTTP://www.bbc.co.uk"""
    + @">BBC</asp:LinkButton>"
    + @"</li>"
    , controlNamePrefix
    , itemcount
    );
    break;
    case ListItemType.AlternatingItem:
    lc.Text = "<TR><TD bgcolor=lightblue>Item number: " + itemcount.ToString() +
    "</TD></TR>";
    break;
    case ListItemType.Footer:
    throw new ArgumentException(@"This template type is not designed for use in
    a header.");
    break;
    }
    container.Controls.Add(lc);
    itemcount += 1;
    }
    }
    }


    Wozza Guest

  2. Similar Questions and Discussions

    1. DataList with linkbuttons
      Can anyone help? I have a DataList with 5 LinkButtons and for some reason my Item_Command event does not get triggered. My code is as follows: ...
    2. help with rss creating code creating an XML rss feed]
      When I run the following code I get the follwing error and cant really see the problem I am incxluding this file from another page thanks in...
    3. Creating DataGrid Via Code...
      Hey all, Been reading up on ASP.NET (using VB.NET) and have been trying to figure out if this is possible. I need to make 4 connections to 4...
    4. Need to build a repeater purely in code
      Hi. I need help adding a repeater to my custom control in code. I have created a custom control that draws a html panel to the screen. I...
    5. Access in code to repeater control's data
      Hi, I am putting a repeater control in an ASP.NET page to show a list of data. All fine. I now want to check the data in one of the data...
  3. #2

    Default Re: Creating LinkButtons in a Repeater ... in code.

    I always create an ItemDataBound event so I can do it in codebehind. It
    seems to be the best way. All I do in that case is, within the itemdatabound
    event, I fetch the linkbutton like so:

    LinkButton lkbContractList =
    (LinkButton)e.Item.FindControl("lkbContractList");

    You can get the datarecord that holds the data as well using the
    e.Item.DataItem property and casting it to a DbDataRecord like so:

    DbDataRecord dr = (DbDataRecord)e.Item.DataItem;

    You can then set any properties you want without problem. Of course, you
    have to time things correctly and ensure that the function that populates
    the repeater is done early enough so that you have items to tie the postback
    events to. If you're using PostBackUrl though I'm not sure if it will
    matter, but it's something to be careful of.


    --

    Hope this helps,
    Mark Fitzpatrick
    Former Microsoft FrontPage MVP 199?-2006



    "Wozza" <warrenroscoe@hotmail.com> wrote in message
    news:O1yzUCvGHHA.5104@TK2MSFTNGP03.phx.gbl...
    > Hi,
    > I'm trying to create a variable number of LinkButtons using an
    > ItemTemplate within a Repeater control. This is being done from code ...
    >
    > I am trying to recreate something similar to the following ... which is in
    > a user control, only I'm doing it in a web part:
    > <ul id="middlenavigationMenu" runat="server">
    > <asp:Repeater ID="rptContractList" runat="server"
    > OnItemCommand="rptContractList_ItemCommand">
    > <ItemTemplate>
    > <li id="middlenavigationMenuListItem" runat="server">
    > <asp:LinkButton ID="lkbContractList" runat="server"
    > PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "PostBackUrl") %>'
    > Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
    > CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > "CommandArgument") %>'>
    > </asp:LinkButton>
    > </li>
    > </ItemTemplate>
    > </asp:Repeater>
    > </ul>
    >
    > THE ISSUE is. that when the web page is being rendered, the <%# bits don't
    > do anything ... they seem to be rendered as tezt (in the html page) and
    > therefore ignored in the page output ...
    > the end result is that although I get some listitems ... there is no
    > LinkButton???
    >
    > Where am I going wrong ... ???
    >
    > thanks
    > Wozza
    >
    > =====
    >
    > My code is below:
    >
    >
    > protected override void CreateChildControls()
    > {
    > ...
    > // Test LinkButton !!!
    > linkButtonRepeater = new Repeater();
    > linkButtonRepeater.ItemTemplate = new
    > LinkButtonItemTemplate(ListItemType.Item);
    > HtmlGenericControl linkButtonUl = new HtmlGenericControl(@"ul");
    > linkButtonUl.Controls.Add(linkButtonRepeater);
    > this.placeHolderTop.Controls.Add(linkButtonUl);
    > // Test LinkButton !!!
    > ...
    > }
    >
    >
    > protected override void Render(HtmlTextWriter writer)
    > {
    > ...
    > // Test LinkButton !!!
    > DataTable dt = new DataTable();
    > // Define the columns of the table.
    > dt.Columns.Add(new DataColumn("PostBackUrl", typeof(String)));
    > dt.Columns.Add(new DataColumn("Text", typeof(String)));
    > dt.Columns.Add(new DataColumn("CommandName", typeof(String)));
    > dt.Columns.Add(new DataColumn("CommandArgument", typeof(String)));
    > DataRow dr;
    > dr = dt.NewRow();
    > dr[0] = @"http://www.google.com";
    > dr[1] = @"!!! PRESS ME !!!";
    > dr[2] = @"XXX";
    > dr[3] = @"http://linkupv2.external/pages/productpicker.aspx";
    > dt.Rows.Add(dr);
    > dr = dt.NewRow();
    > dr[0] = @"http://www.bbc.co.uk";
    > dr[1] = @"!!! PRESS ME !!!";
    > dr[2] = @"XXX";
    > dr[3] = @"http://linkupv2.external/pages/productpicker.aspx";
    > dt.Rows.Add(dr);
    > DataView dv = new DataView(dt);
    > linkButtonRepeater.DataSource = dv;
    > linkButtonRepeater.DataBind();
    > linkButtonRepeater.ItemCommand += new
    > RepeaterCommandEventHandler(linkButtonRepeater_Ite mCommand);
    > // Test LinkButton !!!
    > ...
    > }
    >
    >
    > namespace TestWebPart
    > {
    > /// <summary>
    > /// <example>
    > ///<ItemTemplate>
    > /// <asp:LinkButton runat="server" ID="xxx" PostBackUrl="Default.aspx"
    > /// Text='<%# DataBinder.Eval(Container.DataItem, "TextNameField") %>'
    > /// CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > "CommandArgumentField") %>'
    > /// >
    > /// </asp:LinkButton>
    > ///</ItemTemplate>
    > /// </example>
    > /// </summary>
    > public class LinkButtonItemTemplate : ITemplate
    > {
    > static int itemcount = 0;
    > static string controlNamePrefix = Guid.NewGuid().ToString();
    > ListItemType templateType;
    > public LinkButtonItemTemplate(ListItemType type)
    > {
    > templateType = type;
    > }
    >
    > // <asp:LinkButton ID="linkButtonList" runat="server"
    > // PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "PostBackUrl") %>'
    > // Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
    > // CommandName='<%# DataBinder.Eval(Container.DataItem, "CommandName")
    > %>'>
    > // CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > "CommandArgument") %>'>
    > // </asp:LinkButton>
    > public void InstantiateIn(System.Web.UI.Control container)
    > {
    > Literal lc = new Literal();
    > switch (templateType)
    > {
    > case ListItemType.Header:
    > throw new ArgumentException(@"This template type is not designed for use
    > in a header.");
    > break;
    > case ListItemType.Item:
    > lc.Text = String.Format
    > (
    > @"<li id=""li{0}{1}"" runat=""server"">"
    > + @"<asp:LinkButton runat=""server"" ID=""{0}{1}"""
    > + @" PostBackUrl='<%# DataBinder.Eval(Container.DataItem, ""PostBackUrl"")
    > %>'"
    > + @" Text='<%# DataBinder.Eval(Container.DataItem, ""Text"") %>'"
    > + @" CommandName='<%# DataBinder.Eval(Container.DataItem, ""CommandName"")
    > %>'"
    > + @" CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > ""CommandArgument"") %>'"
    > + @">{0}{1}</asp:LinkButton>"
    > + @"</li>"
    > , controlNamePrefix
    > , itemcount
    > );
    > lc.Text = String.Format
    > (
    > @"<li id=""li{0}{1}"" runat=""server"">"
    > + @"<asp:LinkButton runat=""server"" ID=""{0}{1}"""
    > + @" PostBackUrl=""HTTP://www.bbc.co.uk"""
    > + @">BBC</asp:LinkButton>"
    > + @"</li>"
    > , controlNamePrefix
    > , itemcount
    > );
    > break;
    > case ListItemType.AlternatingItem:
    > lc.Text = "<TR><TD bgcolor=lightblue>Item number: " + itemcount.ToString()
    > + "</TD></TR>";
    > break;
    > case ListItemType.Footer:
    > throw new ArgumentException(@"This template type is not designed for use
    > in a header.");
    > break;
    > }
    > container.Controls.Add(lc);
    > itemcount += 1;
    > }
    > }
    > }
    >

    Mark Fitzpatrick Guest

  4. #3

    Default Re: Creating LinkButtons in a Repeater ... in code.

    Wozza,

    When you see the bindings are not firing it could be that the data was
    already bound before you placed that text or it does not know that it
    should data bind. What you can try is adding this line after you have
    defined all of those data bind placeholders...

    DataBind();

    Perhaps place it in a Load handler as everything else will be happening
    in Init or before that. Just be sure to do it after the data is
    loaded.

    It should look at the current context for items to process data
    binding.

    More Info:
    [url]http://msdn2.microsoft.com/en-us/library/system.web.ui.control.databind.aspx[/url]

    Brennan Stehling
    [url]http://brennan.offwhite.net/blog/[/url]

    Wozza wrote:
    > Hi,
    > I'm trying to create a variable number of LinkButtons using an ItemTemplate
    > within a Repeater control. This is being done from code ...
    >
    > I am trying to recreate something similar to the following ... which is in a
    > user control, only I'm doing it in a web part:
    > <ul id="middlenavigationMenu" runat="server">
    > <asp:Repeater ID="rptContractList" runat="server"
    > OnItemCommand="rptContractList_ItemCommand">
    > <ItemTemplate>
    > <li id="middlenavigationMenuListItem" runat="server">
    > <asp:LinkButton ID="lkbContractList" runat="server"
    > PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "PostBackUrl") %>'
    > Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
    > CommandArgument='<%# DataBinder.Eval(Container.DataItem, "CommandArgument")
    > %>'>
    > </asp:LinkButton>
    > </li>
    > </ItemTemplate>
    > </asp:Repeater>
    > </ul>
    >
    > THE ISSUE is. that when the web page is being rendered, the <%# bits don't
    > do anything ... they seem to be rendered as tezt (in the html page) and
    > therefore ignored in the page output ...
    > the end result is that although I get some listitems ... there is no
    > LinkButton???
    >
    > Where am I going wrong ... ???
    >
    > thanks
    > Wozza
    >
    > =====
    >
    > My code is below:
    >
    >
    > protected override void CreateChildControls()
    > {
    > ...
    > // Test LinkButton !!!
    > linkButtonRepeater = new Repeater();
    > linkButtonRepeater.ItemTemplate = new
    > LinkButtonItemTemplate(ListItemType.Item);
    > HtmlGenericControl linkButtonUl = new HtmlGenericControl(@"ul");
    > linkButtonUl.Controls.Add(linkButtonRepeater);
    > this.placeHolderTop.Controls.Add(linkButtonUl);
    > // Test LinkButton !!!
    > ...
    > }
    >
    >
    > protected override void Render(HtmlTextWriter writer)
    > {
    > ...
    > // Test LinkButton !!!
    > DataTable dt = new DataTable();
    > // Define the columns of the table.
    > dt.Columns.Add(new DataColumn("PostBackUrl", typeof(String)));
    > dt.Columns.Add(new DataColumn("Text", typeof(String)));
    > dt.Columns.Add(new DataColumn("CommandName", typeof(String)));
    > dt.Columns.Add(new DataColumn("CommandArgument", typeof(String)));
    > DataRow dr;
    > dr = dt.NewRow();
    > dr[0] = @"http://www.google.com";
    > dr[1] = @"!!! PRESS ME !!!";
    > dr[2] = @"XXX";
    > dr[3] = @"http://linkupv2.external/pages/productpicker.aspx";
    > dt.Rows.Add(dr);
    > dr = dt.NewRow();
    > dr[0] = @"http://www.bbc.co.uk";
    > dr[1] = @"!!! PRESS ME !!!";
    > dr[2] = @"XXX";
    > dr[3] = @"http://linkupv2.external/pages/productpicker.aspx";
    > dt.Rows.Add(dr);
    > DataView dv = new DataView(dt);
    > linkButtonRepeater.DataSource = dv;
    > linkButtonRepeater.DataBind();
    > linkButtonRepeater.ItemCommand += new
    > RepeaterCommandEventHandler(linkButtonRepeater_Ite mCommand);
    > // Test LinkButton !!!
    > ...
    > }
    >
    >
    > namespace TestWebPart
    > {
    > /// <summary>
    > /// <example>
    > ///<ItemTemplate>
    > /// <asp:LinkButton runat="server" ID="xxx" PostBackUrl="Default.aspx"
    > /// Text='<%# DataBinder.Eval(Container.DataItem, "TextNameField") %>'
    > /// CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > "CommandArgumentField") %>'
    > /// >
    > /// </asp:LinkButton>
    > ///</ItemTemplate>
    > /// </example>
    > /// </summary>
    > public class LinkButtonItemTemplate : ITemplate
    > {
    > static int itemcount = 0;
    > static string controlNamePrefix = Guid.NewGuid().ToString();
    > ListItemType templateType;
    > public LinkButtonItemTemplate(ListItemType type)
    > {
    > templateType = type;
    > }
    >
    > // <asp:LinkButton ID="linkButtonList" runat="server"
    > // PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "PostBackUrl") %>'
    > // Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
    > // CommandName='<%# DataBinder.Eval(Container.DataItem, "CommandName") %>'>
    > // CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > "CommandArgument") %>'>
    > // </asp:LinkButton>
    > public void InstantiateIn(System.Web.UI.Control container)
    > {
    > Literal lc = new Literal();
    > switch (templateType)
    > {
    > case ListItemType.Header:
    > throw new ArgumentException(@"This template type is not designed for use in
    > a header.");
    > break;
    > case ListItemType.Item:
    > lc.Text = String.Format
    > (
    > @"<li id=""li{0}{1}"" runat=""server"">"
    > + @"<asp:LinkButton runat=""server"" ID=""{0}{1}"""
    > + @" PostBackUrl='<%# DataBinder.Eval(Container.DataItem, ""PostBackUrl"")
    > %>'"
    > + @" Text='<%# DataBinder.Eval(Container.DataItem, ""Text"") %>'"
    > + @" CommandName='<%# DataBinder.Eval(Container.DataItem, ""CommandName"")
    > %>'"
    > + @" CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > ""CommandArgument"") %>'"
    > + @">{0}{1}</asp:LinkButton>"
    > + @"</li>"
    > , controlNamePrefix
    > , itemcount
    > );
    > lc.Text = String.Format
    > (
    > @"<li id=""li{0}{1}"" runat=""server"">"
    > + @"<asp:LinkButton runat=""server"" ID=""{0}{1}"""
    > + @" PostBackUrl=""HTTP://www.bbc.co.uk"""
    > + @">BBC</asp:LinkButton>"
    > + @"</li>"
    > , controlNamePrefix
    > , itemcount
    > );
    > break;
    > case ListItemType.AlternatingItem:
    > lc.Text = "<TR><TD bgcolor=lightblue>Item number: " + itemcount.ToString() +
    > "</TD></TR>";
    > break;
    > case ListItemType.Footer:
    > throw new ArgumentException(@"This template type is not designed for use in
    > a header.");
    > break;
    > }
    > container.Controls.Add(lc);
    > itemcount += 1;
    > }
    > }
    > }
    Brennan Stehling Guest

  5. #4

    Default Re: Creating LinkButtons in a Repeater ... in code.


    OK ... thanks for the suggestions guys ... ... I managed to find a really
    good article about this ...

    my code changes revolved around implementing the DataBind on the LinkButton
    control that is added to the repeater ...

    See:
    [url]http://msdn.microsoft.com/msdnmag/issues/02/01/cutting/[/url] and
    [url]http://msdn.microsoft.com/msdnmag/issues/05/06/CuttingEdge/[/url]

    Code that worked ...

    public void InstantiateIn(System.Web.UI.Control container)
    {
    HtmlGenericControl linkButtonTemplate = new HtmlGenericControl(@"li");
    linkButtonTemplate.ID = String.Format(@"lit{0}{1}", controlNamePrefix,
    itemcount);
    switch (templateType)
    {
    case ListItemType.Header:
    throw new ArgumentException(@"This template type is not designed for use in
    a header.");
    break;
    case ListItemType.Item:
    case ListItemType.AlternatingItem:
    LinkButton linkButton = new LinkButton();
    linkButton.ID = String.Format(@"lbn{0}{1}", controlNamePrefix, itemcount);
    linkButton.DataBinding += new EventHandler(linkButton_DataBinding);
    linkButtonTemplate.Controls.Add(linkButton);
    break;
    case ListItemType.Footer:
    throw new ArgumentException(@"This template type is not designed for use in
    a header.");
    break;
    }
    container.Controls.Add(linkButtonTemplate);
    itemcount += 1;
    }
    void linkButton_DataBinding(object sender, EventArgs e)
    {
    LinkButton linkButton = (LinkButton)sender;
    RepeaterItem container = (RepeaterItem)linkButton.NamingContainer;
    linkButton.Text = (string)DataBinder.GetPropertyValue(container.Data Item,
    "Text", "{0:d}");
    linkButton.PostBackUrl =
    (string)DataBinder.GetPropertyValue(container.Data Item, "PostBackUrl",
    "{0:d}");
    //linkButton.CommandName =
    (string)DataBinder.GetPropertyValue(container.Data Item, "CommandName",
    "{0:d}");
    //linkButton.CommandArgument =
    (string)DataBinder.GetPropertyValue(container.Data Item, "CommandArgument",
    "{0:d}");
    }

    "Wozza" <warrenroscoe@hotmail.com> wrote in message
    news:O1yzUCvGHHA.5104@TK2MSFTNGP03.phx.gbl...
    > Hi,
    > I'm trying to create a variable number of LinkButtons using an
    > ItemTemplate within a Repeater control. This is being done from code ...
    >
    > I am trying to recreate something similar to the following ... which is in
    > a user control, only I'm doing it in a web part:
    > <ul id="middlenavigationMenu" runat="server">
    > <asp:Repeater ID="rptContractList" runat="server"
    > OnItemCommand="rptContractList_ItemCommand">
    > <ItemTemplate>
    > <li id="middlenavigationMenuListItem" runat="server">
    > <asp:LinkButton ID="lkbContractList" runat="server"
    > PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "PostBackUrl") %>'
    > Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
    > CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > "CommandArgument") %>'>
    > </asp:LinkButton>
    > </li>
    > </ItemTemplate>
    > </asp:Repeater>
    > </ul>
    >
    > THE ISSUE is. that when the web page is being rendered, the <%# bits don't
    > do anything ... they seem to be rendered as tezt (in the html page) and
    > therefore ignored in the page output ...
    > the end result is that although I get some listitems ... there is no
    > LinkButton???
    >
    > Where am I going wrong ... ???
    >
    > thanks
    > Wozza
    >
    > =====
    >
    > My code is below:
    >
    >
    > protected override void CreateChildControls()
    > {
    > ...
    > // Test LinkButton !!!
    > linkButtonRepeater = new Repeater();
    > linkButtonRepeater.ItemTemplate = new
    > LinkButtonItemTemplate(ListItemType.Item);
    > HtmlGenericControl linkButtonUl = new HtmlGenericControl(@"ul");
    > linkButtonUl.Controls.Add(linkButtonRepeater);
    > this.placeHolderTop.Controls.Add(linkButtonUl);
    > // Test LinkButton !!!
    > ...
    > }
    >
    >
    > protected override void Render(HtmlTextWriter writer)
    > {
    > ...
    > // Test LinkButton !!!
    > DataTable dt = new DataTable();
    > // Define the columns of the table.
    > dt.Columns.Add(new DataColumn("PostBackUrl", typeof(String)));
    > dt.Columns.Add(new DataColumn("Text", typeof(String)));
    > dt.Columns.Add(new DataColumn("CommandName", typeof(String)));
    > dt.Columns.Add(new DataColumn("CommandArgument", typeof(String)));
    > DataRow dr;
    > dr = dt.NewRow();
    > dr[0] = @"http://www.google.com";
    > dr[1] = @"!!! PRESS ME !!!";
    > dr[2] = @"XXX";
    > dr[3] = @"http://linkupv2.external/pages/productpicker.aspx";
    > dt.Rows.Add(dr);
    > dr = dt.NewRow();
    > dr[0] = @"http://www.bbc.co.uk";
    > dr[1] = @"!!! PRESS ME !!!";
    > dr[2] = @"XXX";
    > dr[3] = @"http://linkupv2.external/pages/productpicker.aspx";
    > dt.Rows.Add(dr);
    > DataView dv = new DataView(dt);
    > linkButtonRepeater.DataSource = dv;
    > linkButtonRepeater.DataBind();
    > linkButtonRepeater.ItemCommand += new
    > RepeaterCommandEventHandler(linkButtonRepeater_Ite mCommand);
    > // Test LinkButton !!!
    > ...
    > }
    >
    >
    > namespace TestWebPart
    > {
    > /// <summary>
    > /// <example>
    > ///<ItemTemplate>
    > /// <asp:LinkButton runat="server" ID="xxx" PostBackUrl="Default.aspx"
    > /// Text='<%# DataBinder.Eval(Container.DataItem, "TextNameField") %>'
    > /// CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > "CommandArgumentField") %>'
    > /// >
    > /// </asp:LinkButton>
    > ///</ItemTemplate>
    > /// </example>
    > /// </summary>
    > public class LinkButtonItemTemplate : ITemplate
    > {
    > static int itemcount = 0;
    > static string controlNamePrefix = Guid.NewGuid().ToString();
    > ListItemType templateType;
    > public LinkButtonItemTemplate(ListItemType type)
    > {
    > templateType = type;
    > }
    >
    > // <asp:LinkButton ID="linkButtonList" runat="server"
    > // PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "PostBackUrl") %>'
    > // Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
    > // CommandName='<%# DataBinder.Eval(Container.DataItem, "CommandName")
    > %>'>
    > // CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > "CommandArgument") %>'>
    > // </asp:LinkButton>
    > public void InstantiateIn(System.Web.UI.Control container)
    > {
    > Literal lc = new Literal();
    > switch (templateType)
    > {
    > case ListItemType.Header:
    > throw new ArgumentException(@"This template type is not designed for use
    > in a header.");
    > break;
    > case ListItemType.Item:
    > lc.Text = String.Format
    > (
    > @"<li id=""li{0}{1}"" runat=""server"">"
    > + @"<asp:LinkButton runat=""server"" ID=""{0}{1}"""
    > + @" PostBackUrl='<%# DataBinder.Eval(Container.DataItem, ""PostBackUrl"")
    > %>'"
    > + @" Text='<%# DataBinder.Eval(Container.DataItem, ""Text"") %>'"
    > + @" CommandName='<%# DataBinder.Eval(Container.DataItem, ""CommandName"")
    > %>'"
    > + @" CommandArgument='<%# DataBinder.Eval(Container.DataItem,
    > ""CommandArgument"") %>'"
    > + @">{0}{1}</asp:LinkButton>"
    > + @"</li>"
    > , controlNamePrefix
    > , itemcount
    > );
    > lc.Text = String.Format
    > (
    > @"<li id=""li{0}{1}"" runat=""server"">"
    > + @"<asp:LinkButton runat=""server"" ID=""{0}{1}"""
    > + @" PostBackUrl=""HTTP://www.bbc.co.uk"""
    > + @">BBC</asp:LinkButton>"
    > + @"</li>"
    > , controlNamePrefix
    > , itemcount
    > );
    > break;
    > case ListItemType.AlternatingItem:
    > lc.Text = "<TR><TD bgcolor=lightblue>Item number: " + itemcount.ToString()
    > + "</TD></TR>";
    > break;
    > case ListItemType.Footer:
    > throw new ArgumentException(@"This template type is not designed for use
    > in a header.");
    > break;
    > }
    > container.Controls.Add(lc);
    > itemcount += 1;
    > }
    > }
    > }
    >

    Wozza Guest

Posting Permissions

  • You may not post new threads
  • You may post replies
  • You may not post attachments
  • You may not edit your posts

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139