【问题标题】:Find Control Inside ListView Control在 ListView 控件中查找控件
【发布时间】:2013-01-31 22:09:47
【问题描述】:

我想在“ListView”控件中找到 ID =“Label”的“Label”控件。我试图用以下代码做到这一点:

((Label)this.ChatListView.FindControl("Label")).Text = "active";

但我得到了这个异常:对象引用未设置为对象的实例

这里有什么问题?

这是aspx代码:

<asp:ListView ID="ChatListView" runat="server" DataSourceID="EntityDataSourceUserPosts">
    <ItemTemplate>
        <div class="post">
            <div class="postHeader">
                <h2><asp:Label ID="Label1" runat="server" 
                    Text= '<%# Eval("Title")  + " by " + this.GetUserFromPost((Guid?)Eval("AuthorUserID")) %>' ></asp:Label></h2>
                <asp:Label ID="Label" runat="server" Text="" Visible="True"></asp:Label>
                <div class="dateTimePost">
                   <%# Eval("PostDate")%>
                </div>
            </div>
            <div class="postContent">
                <%# Eval("PostComment") %>
            </div>
        </div>
    </ItemTemplate>

</asp:ListView>

【问题讨论】:

  • 在页面加载方法中

标签: c# asp.net exception webforms


【解决方案1】:

Listview 是一个数据绑定控件;所以它里面的控件对于不同的行会有不同的ID。您必须首先检测行,然后获取控件。最好在OnItemDataBound 之类的事件中获取此类控件。在那里,您可以执行以下操作来获取控制权:

protected void myListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        var yourLabel = e.Item.FindControl("Label1") as Label;

        // ...
    }
}

如果你想在Page_Load 中抓取它,你必须知道特定的行 并将控件检索为:

var theLabel = this.ChatListView.Items[<row_index>].FindControl("Label1") as Label;

【讨论】:

    【解决方案2】:

    这个函数会从数据库中获取作者姓名,你只需要调用你的方法获取作者姓名然后返回

    protected string GetUserFromPost(Guid? x)
    {
        // call your function to get Author Name
        return "User Name";
    }
    

    要在列表视图中绑定标签,您必须在列表视图ItemDataBound Event 中进行绑定

    protected void ChatListView_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            Label lbl = e.Item.FindControl("Label") as Label;
            lbl.Text = "Active";
        }
    }
    

    这里是列表视图 aspx 代码更改(只需添加onitemdatabound="ChatListView_ItemDataBound"):

    asp:ListView 
    ID="ChatListView" 
    runat="server" 
    DataSourceID="EntityDataSourceUserPosts" 
    onitemdatabound="ChatListView_ItemDataBound" 
    

    【讨论】:

      【解决方案3】:

      在争论中应该是Label1:

       ((Label)this.ChatListView.FindControl("Label1")).Text = "active";
      

      这应该在数据绑定事件中。

      http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx

      【讨论】:

      • 这应该在数据绑定事件中。
      【解决方案4】:

      试试看:

      protected void ChatListView_ItemDataBound(object sender, ListViewItemEventArgs e)
      {
          if (e.Item is ListViewDataItem)
          {
               var yourLabel = e.Item.FindControl("Label1") as Label;
               // ...
          }
      }
      

      【讨论】:

        【解决方案5】:

        避免FindControl 代码的一个简单解决方案是在标签上放置OnInit

        这会将您的页面代码更改为:&lt;asp:Label ID="Label" runat="server" Text="" Visible="True" OnInit="Label_Init"&gt;&lt;/asp:Label&gt;

        在你后面的代码中,你现在将有一个这样的函数:

        protected void Label_Init(object sender, EventArgs e)
        {
             Label lblMyLabel = (Label)sender;
             lblMyLabel.Text = "My Text";
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-11
          • 1970-01-01
          • 1970-01-01
          • 2011-08-07
          • 1970-01-01
          • 1970-01-01
          • 2011-11-06
          相关资源
          最近更新 更多