2013-02-07 82 views
3

我有我的母版:控件不會出現在CodeBehind中?

<%@ 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> 

在那裏我有:

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

與此類似,鏈接顯示在代碼罰款後面。

現在,如果我將它們移動到我的中繼器的腳註:

...

  <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> 

然後,他們不再可以在後面的代碼中使用。

我真的不明白這一點。

爲什麼它不起作用?

+0

‘然後,他們再也不能在後面的代碼中使用。’解釋「不能使用」的含義。 – aquinas

+0

簡短的回答是,「這是模板控件如何工作」。稍微長一點的答案是您已經更改了控件的父級,並且頁面本身不再擁有該控件。 – GalacticCowboy

+0

由於您放置在中繼器控件中,因此無法直接在代碼後面訪問。檢查這個http://stackoverflow.com/questions/701412/how-to-find-controls-in-a-repeater-header-or-footer – Sunny

回答

0

由於控件不再位於主窗體上,因此它們不再是Page的屬性。他們可以通過Repeater訪問。

有關通過Repeater訪問控件的示例,請參閱this question

0

當你將對象放入中繼器,網格等時,你必須在後端做更多的處理才能找到它們。基本上,當中繼器被綁定時,可以通過搜索對象,然後訪問其屬性。

例如,下面是一些代碼的鏈接轉發器查找各個項目控制在項目勢必

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; 
      } 
     } 
    } 

個人而言,我從來沒有試圖去的控制在頁眉或頁腳一箇中繼器,但我相信它會是類似的東西

2

RepeaterItem有一個不同的NamingContainer。您只能直接訪問位於頁面頂部的控件,因爲這些控件是在部分代碼隱藏類中自動創建的。您必須使用FindControl才能獲得RepeaterItem中控件的參考。

在這種情況下,你可以使用RepeaterItemDataBound事件:

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"); 
    } 
} 
相關問題