【问题标题】:How to access textbox, label inside update panel from code behind using asp.net web forms如何使用 asp.net Web 表单从代码后面的代码访问文本框、更新面板内的标签
【发布时间】:2012-02-24 03:33:21
【问题描述】:

我在更新面板中定义了一些控件,这些控件绑定到中继器控件。我需要根据匿名字段隐藏和显示用户名和国家/地区,但问题是我无法以编程方式访问更新面板中定义的控件。

如何访问这些控件,我也在网上找了很多参考资料

下面是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");
    }

【问题讨论】:

    标签: c# asp.net webforms asp.net-ajax code-behind


    【解决方案1】:

    如果控件在中继器内

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

    应该做的工作。 否则,您可以直接访问控件。如果不是,页面有错误并且没有编译

    【讨论】:

      【解决方案2】:

      问题不在于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 替换为您首先绑定到中继器的集合/列表/表的对象类型。

      希望对您有所帮助。

      【讨论】:

      • 我是如此接近,如果我得到 MyObject myObject = (MyObject)e.Item.DataItem;线对。我如何将它与数据字段绑定..“comAnonymous”
      • 将 MyObject 更改为您绑定到中继器的任何内容。例如,如果您要绑定 DataRows 的集合,您将使用 DataRow myDataRow = (DataRow)e.Item.DataItem; 并通过 myDataRow["comAnonymous"].ToString() 引用它。
      • 它给了我 DataRow 的错误,所以我使用了 DataRowView,现在它工作正常。非常感谢...这就是为什么我喜欢 stack over flow 的原因。我是个人工作,所以当我遇到困难时,没有人可以帮助我。 SO就像一个指南,及时的帮助是一个救星。再次感谢
      • 工作:- DataRowView myDataRow = (DataRowView)e.Item.DataItem; // 变魔术! if (isAnonymous == true) lblComUserName.Visible = false;
      • 啊,是的,当您将DataView 绑定到中继器时需要DataRowView(例如DataTable.DefaultView)。没问题 :) 很高兴能提供帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多