2010-08-25 35 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 
    } 
}