user2043533
user2043533

Reputation: 751

Control does not show up in CodeBehind?

I have my masterpage:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="KezberProjectManager.master.cs" Inherits="KezberProjectManager.KezberProjectManager" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <!-- Le styles -->
    <link href="assets/css/bootstrap.css" rel="stylesheet"/>
    <link href="assets/css/bootstrap-responsive.css" rel="stylesheet"/>
    <link href="assets/css/kezblu.styles.css" rel="stylesheet"/>

    <style type="text/css">

    </style>
    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.0.min.js"></script>
    <script type="text/javascript" src="assets/js/kezcommon.js"></script>
    <script type="text/javascript">

        $(document).ready
    (
        function () {

            createAutoClosingAlert('.success_alert', 6000);
        }
    );

        function createAutoClosingAlert(selector, delay) {
            var alert = $(selector).alert();
            window.setTimeout(function () { $(alert).slideUp() }, delay);
        }

</script>  


    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
<asp:Repeater runat="server" id="MenuRepeater">
  <headertemplate>
       <div class="navbar navbar-inverse navbar-fixed-top">
      <div class="navbar-inner">
        <div class="container">
          <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </a>
          <a class="brand" href="#">KezBlu</a>
          <div class="nav-collapse collapse">
            <ul class="nav">
  </headertemplate>
  <itemtemplate>
     <%# Eval("Content") %>
  </itemtemplate>
  <footertemplate>
             </ul>

          </div><!--/.nav-collapse -->
        </div>
      </div>
    </div>
  </footertemplate>
 </asp:Repeater>


    <div id="wrap">
       <div id="content">
           <div id="alerts">
               <div class="bs-docs-example">
                        <div id="auth">
                 <asp:HyperLink id="HyperLink1" runat="server">HyperLink</asp:HyperLink>
             </br>
                 <asp:HyperLink id="HyperLink2" runat="server">HyperLink</asp:HyperLink>
             </div>
              <div runat="server"  id="success_alert" class="success_alert alert alert-success fade in">
                <button type="button" class="close" data-dismiss="alert">&times;</button>
                   <div runat="server" id="success_alert_text">
                </div>
              </div>
             </div>
              <div class="bs-docs-example">
              <div runat="server" id="error_alert" class="error_alert alert alert-error fade in">
                <button type="button" class="close" data-dismiss="alert">&times;</button>
                <div runat="server" id="error_alert_text">
                </div>
              </div>
             </div>
            </div>
       <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

       </asp:ContentPlaceHolder>
       </div>


    </div>
    </form>
      <!-- Le javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->

    <script type="text/javascript" src="assets/js/bootstrap.min.js"></script>
</body>
</html>

In there I have:

     <div id="auth">
         <asp:HyperLink id="HyperLink1" runat="server">HyperLink</asp:HyperLink>
     </br>
         <asp:HyperLink id="HyperLink2" runat="server">HyperLink</asp:HyperLink>
     </div>

Like this, the links show up fine in code behind.

Now, if I move them into my repeater's footer:

...

          <div class="nav-collapse collapse">
            <ul class="nav">
  </headertemplate>
  <itemtemplate>
     <%# Eval("Content") %>
  </itemtemplate>
  <footertemplate>
             </ul>
             <div id="auth">
                 <asp:HyperLink id="HyperLink1" runat="server">HyperLink</asp:HyperLink>
             </br>
                 <asp:HyperLink id="HyperLink2" runat="server">HyperLink</asp:HyperLink>
             </div>

          </div><!--/.nav-collapse -->
        </div>
      </div>
    </div>
  </footertemplate>
 </asp:Repeater>

Then they no longer can be used in code behind.

I really really do not understand this.

Why is it not working?

Upvotes: 3

Views: 1466

Answers (3)

Tim Schmelter
Tim Schmelter

Reputation: 460018

The RepeaterItem has a different NamingContainer. You can access only controls that are on top of the page directly since these controls are created in the partial codebehind class automatically. You have to use FindControl to get the reference of a control in a RepeaterItem.

In this case you could use the Repeater's ItemDataBound event:

protected void Repater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
    // This event is raised for the header, the footer, separators, and items.
    if (e.Item.ItemType == ListItemType.Footer)
    {
        HyperLink hl = (HyperLink)e.Item.FindControl("HyperLink1");
    }
}   

Upvotes: 2

Chris Hammond
Chris Hammond

Reputation: 8943

When you are putting objects into Repeaters, Grids, etc, you have to do a lot more processing in the backend to be able to find them. Basically when the repeater is bound, you can go through and search for the object, and then access its properties.

For example here is a link to some code for a repeater looking up the various item controls when an Item is bound

protected void rptTaskListOnItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
        {
            var lnkEdit = e.Item.FindControl("lnkEdit") as HyperLink;
            var lnkDelete = e.Item.FindControl("lnkDelete") as LinkButton;

            var pnlAdminControls = e.Item.FindControl("pnlAdmin") as Panel;

            var t = (Task)e.Item.DataItem;

            if (IsEditable && lnkDelete != null && lnkEdit != null && pnlAdminControls != null)
            {
                pnlAdminControls.Visible = true;
                lnkDelete.CommandArgument = t.TaskId.ToString();
                lnkDelete.Enabled = lnkDelete.Visible = lnkEdit.Enabled = lnkEdit.Visible = true;

                lnkEdit.NavigateUrl = EditUrl(string.Empty, string.Empty, "Edit", "tid=" + t.TaskId);

                ClientAPI.AddButtonConfirm(lnkDelete, Localization.GetString("ConfirmDelete", LocalResourceFile));
            }
            else
            {
                pnlAdminControls.Visible = false;
            }
        }
    }

Personally I have never tried to get to the controls in a header or footer of a repeater, but I am sure it would be something similar

Upvotes: 0

D Stanley
D Stanley

Reputation: 152501

Because the controls are no longer on the main form they are no longer properties of the Page. They can instead be accessed through the Repeater.

See this question for an example on accessing the controls through the Repeater.

Upvotes: 0

Related Questions