Буквально в коде позади - PullRequest
       3

Буквально в коде позади

4 голосов
/ 25 августа 2010

почему я не могу получить доступ к литералу за кодом моей страницы 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 - неизвестный элемент за кодом.

Ответы [ 2 ]

6 голосов
/ 25 августа 2010

ltlText напрямую неизвестен, поскольку он находится в элементе управления, содержащем ваш ретранслятор. Если вы хотите добраться до него, вам нужно перебрать строки репитера, например, в событии ItemDataBound , и там использовать метод 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 голосов
/ 25 августа 2010

Это потому, что литерал находится внутри повторителя. Возможно, несколько его экземпляров создаются с использованием предоставленного вами шаблона, поэтому простое обращение к нему по имени не сработает.

Используйте что-то вроде:

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