How to access textbox, label inside update panel from code behind using asp.net web forms
Asked Answered
T

2

5

I have a few controls defined inside an update panel which are bound to repeater control. I need to hide and show the user name and country based on anonymous fields, but the problem is that I'm not able to access the controls defined inside update panel programmatically.

How can I access these controls, I looked on the net also but couldn't find many references

Below is the code from aspx page and .cs page

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

Code Behind

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;

}

Function To bind repeater control with Pager and Repeater control

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");
    }
Thynne answered 1/2, 2012 at 12:47 Comment(0)
M
5

The problem isn't with UpdatePanel, but with the Repeater. Controls inside the update panel can be directly accessed within the scope of the page (such as the repeater itself), whilst controls within the repeater have to be "found" during or after they have been bound. Your code within the repeater is a template for many items and not specific to any one.

I'd suggest adding an ItemDataBound event to your repeater and perform the logic inside this event as each item is being bound to the repeater.

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

Obviously, replace MyObject with the object type of the collection/list/table you are binding to the repeater in the first place.

Hope that helps.

Mastrianni answered 1/2, 2012 at 13:9 Comment(6)
I am so close, if i get MyObject myObject = (MyObject)e.Item.DataItem; line right. how can i bind it with data field.. "comAnonymous"Thynne
Change MyObject to whatever you are binding to the repeater. For instance, if you're binding a collection of DataRows, you would use DataRow myDataRow = (DataRow)e.Item.DataItem; and reference it through myDataRow["comAnonymous"].ToString().Mastrianni
It gave me errors with DataRow so i used DataRowView and now it works fine. Thanks you so much... This is why i love stack over flow. I work as individual so i have no one to help me around when i get stuck. SO is like a guide and timely help is a savior. Thanks againThynne
WORKING:- DataRowView myDataRow = (DataRowView)e.Item.DataItem; // do the magic! if (isAnonymous == true) lblComUserName.Visible = false;Thynne
Ahh yes, DataRowView is needed when you bind a DataView to the repeater (eg. DataTable.DefaultView). And no problem :) It's a pleasure to help.Mastrianni
I must appreciate your help. and thanks you all guys you who are helping people like me who are not part of development team where they can learn rather we feel lonely at time and frustrated by bugs at times..Thynne
S
4

If the control is inside the repeater

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

should do the job. Otherwise you can directly access the controls. If not the page has errors and not compiling

Splotch answered 1/2, 2012 at 13:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.