2010-08-25 73 views
4

爲什麼我無法訪問我的asp.net頁面後面的字面值?文字在代碼後面

<%@ Page Title="" Language="VB" MasterPageFile="~/UI/Masters/Window.master" AutoEventWireup="false" CodeFile="HelpViewer.aspx.vb" Inherits="UI_Pages_HelpViewer" culture="auto" meta:resourcekey="PageResource1" uiculture="auto" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="c" Runat="Server"> 
<%--<div dir="rtl"> 
    <asp:Panel ID="Panel1" Height="270px" Width="100%" ScrollBars="Auto" 
     runat="server" meta:resourcekey="Panel1Resource1"> 
     <asp:Literal ID="Literal1" runat="server" meta:resourceKey="Literal1Resource1"></asp:Literal> 
</asp:Panel> 
</div>--%> 

<div dir="rtl" align="right"> 
     <asp:Repeater ID="rptHelp" runat="server" DataSourceID="xmlHelp"> 
      <ItemTemplate> 
       <div style ="font-size:12px; font-family :Tahoma; font-weight:bold; margin-left:5px; color:Green; "> 
         <asp:Literal ID="ltlTitle" runat="server" Text='<%#XPath("title")%>'></asp:Literal> 
       </div> 
       <div style="font-size:11px;margin-bottom:10px; margin-left:12px; margin-right:4px; font-family:Tahoma ; margin-top:9px;"> 
        <asp:Literal ID="ltlText" runat="server" Text='<%#XPath("text")%>'></asp:Literal> 
       </div> 
      </ItemTemplate> 
     </asp:Repeater> 
     <asp:XmlDataSource ID="xmlHelp" runat="server"></asp:XmlDataSource> 
    </div> 
</asp:Content> 

ltlText在後面的代碼中是未知元素。

+0

我在這個網站最大的問題是我不能使用語法高亮:( 和主持人總是要修改我的問題:( – Shahin 2010-08-25 08:46:22

+1

@shaahin ,格式化你的代碼,選擇你的代碼片段,然後按下「Ctrl + K」,或者在每行的開始處留下4個空白區域,並且確保你閱讀了這個:http://stackoverflow.com/editing-help – 2010-08-25 08:47:40

+1

@shaahin。只需閱讀markdown語法:http://stackoverflow.com/editing-help。這很容易理解。 – XIII 2010-08-25 08:48:15

回答

6

ltlText因爲它生活在一個包含控件中而不是直接未知的:你的中繼器。如果你想得到它,你需要遍歷中繼器行,例如在ItemDataBound event中,並使用FindControl方法找到你的文字。

查看MSDN文檔中的示例代碼:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

你後的代碼可能是這個樣子:

rptHelp_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 

     Literal lt = (Literal)e.Item.FindControl("ltlText"); 
     lt.Text = "Test"; 
    } 
} 
4

這是因爲文字是一箇中繼器內。可能使用您提供的模板創建它的多個實例,因此僅僅通過名稱引用它不會起作用。

使用類似:

Literal ltlText = (Literal)rptHelp.Items[0].FindControl("ltlText"); 
// Do stuff with literal 

對不起,沒有足夠的清醒轉換到VB語法的權利,但希望你的想法。

而不是像這樣訪問這些項目,你可能會希望在中繼器正在完成它的工作時執行你的代碼,例如在你的控件的事件處理函數OnItemDataBound中。

一個例子事件處理程序的一些更多的C#代碼:

protected void rptHelp_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
    { 
     // In this example, the repeater's data source is a DataTable, 
     // so each item corresponds to a DataRow 
     DataRow row = e.Item.DataItem as DataRow; 
     Literal ltlText = (Literal)e.Item.FindControl("ltlText"); 
     // Set literal based on data here 
    } 
}