Как получить доступ к текстовому полю, пометить внутри панели обновления из кода, используя веб-формы asp.net - PullRequest
5 голосов
/ 01 февраля 2012

У меня есть несколько элементов управления, определенных внутри панели обновления, которые привязаны к элементу управления повторителем. Мне нужно скрыть и показать имя пользователя и страну на основе анонимных полей, но проблема в том, что я не могу получить программный доступ к элементам управления, определенным на панели обновления.

Как я могу получить доступ к этим элементам управления, я тоже посмотрел в сети, но не смог найти много ссылок

Ниже приведен код со страницы aspx и страницы .cs

<asp:UpdatePanel ID="updPnlComments" runat="server">
<ContentTemplate>
<table border="0" width="100%" ><tr><td valign="top">
    <asp:Repeater ID="rptCommentList" runat="server" EnableViewState="false">
       <ItemTemplate>
            <div id="divComPostDate" class="ArticlePubDate">
                <asp:Label ID="lblComDateAdded" runat="server" Text="Added"></asp:Label> 
                <asp:Label ID="lblComPostDate" runat="server" Text='<%# FormatCommentDate(Eval("comPostDate")) %>'></asp:Label>
            </div>
            <div id="divComMSGDetail" class="PostCommentMSG">
                <asp:Label ID="lblComMSGDetails"  runat="server" Text='<%# Eval("comMessage") %>'></asp:Label> 
            </div>
            <div id="divComUserName" class="ComUserName">
                <asp:Label ID="lblComUserName" runat="server" Text='<%# Eval("comFullName") %>'></asp:Label>,
                <asp:Label ID="lblComCountry" runat="server" Text='<%# Eval("comCountry") %>'></asp:Label>
                <asp:Label ID="lblUserAnonymous" runat="server" Text='<%# showUserName(Eval("comAnonymous")) %>' Visible=false></asp:Label>
            </div>
            <div id="divThinlLine" class="ThinLine" ></div>
        </ItemTemplate>
     </asp:Repeater>
  </td></tr><tr><td>
    <table border="0" width="90%" ><tr><td align="center" valign="bottom" height="50px">
      <table border="0"><tr><td align="center" >
             <uc1:PagerControl ID="PagerControl1" runat="server"  CssClass="gold-pager"  PageMode="LinkButton"  />
      </td></tr></table>
    </td></tr></table>
</td></tr></table>
</ContentTemplate>
</asp:UpdatePanel>

Код позади

protected string FormatCommentDate(object dt)
{
    string date;
    date  = String.Format("{0:hh:mm, MMMM dd, yyyy}", dt);
    return date;
}

protected string showUserName(object userName)
{
    String str=null;
    try
    {
        Boolean isUserAnonymous = Convert.ToBoolean(userName);

        if (isUserAnonymous == true)
        {
            // Not able to access lblComUserName CONTROL here

        }

    }
    catch (Exception ex)
    {

    }

    return str;

}

Функция Для привязки управления повторителем с помощью пейджера и управления повторителем

protected void getCommentsList(int iArticleID)
{
    try
    {

        PagerControl1.PageSize = 4;
        //PagerControl1.TotalItems = 1;
        //PagerControl1.PageMode = 4;
        PagerControl1.DisplayEntriesCount = 5;
        //Will show 2 links after ...
        PagerControl1.EdgeEntriesCount = 0;
        DataSet ds = DataProvider.GetCommentList(iArticleID);
        DataView dv = ds.Tables[0].DefaultView;

        //pass the datatable and control to bind
        PagerControl1.BindDataWithPaging(rptCommentList, dv.Table);

    }
    catch (Exception ex)
    {
        HttpContext.Current.Response.Redirect("Message.aspx?msg=Invalid Request");
    }

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

Если элемент управления находится внутри ретранслятора

 Label lbl=(Label)Repeater1.FindControl("lbl1");

должен выполнить эту работу.В противном случае вы можете получить прямой доступ к элементам управления.Если нет, то на странице есть ошибки и не компилируется

4 голосов
/ 01 февраля 2012

Проблема не в UpdatePanel, а в Repeater.К элементам управления внутри панели обновлений можно непосредственно обращаться в пределах области страницы (например, к самому повторителю), в то время как элементы управления в повторителе должны быть «найдены» во время или после того, как они были связаны.Ваш код в повторителе является шаблоном для многих элементов и не относится ни к одному из них.

Я бы предложил добавить событие ItemDataBound к вашему повторителю и выполнить логику внутри этого события, когда каждый элемент привязанк повторителю.

<asp:Repeater ID="rptCommentList" runat="server" EnableViewState="false"
     OnItemDataBound="rptCommentList_ItemDataBound">

protected void rptCommentList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {
        // get the data item
        MyObject myObject = (MyObject)e.Item.DataItem;

        // find the label
        Label lblComUserName = (Label)e.Item.FindControl("lblComUserName");

        // do the magic!
        if (myObject.comAnonymous)
             lblComUserName.Visible = false;
    }
}

Очевидно, замените MyObject типом объекта коллекции / списка / таблицы, которую вы привязываете к повторителю.

Надеюсь, это поможет.

...