C# 如何为嵌套gridview中的控件赋值?

C# 如何为嵌套gridview中的控件赋值?,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个名为“gvParentGrid”的父gridview,其中嵌套了名为“gvChildGrid”的gridview。我在父gridview-gvParentGrid中创建了一个行数据绑定事件 我正在尝试将label11分配给sql查询输出。在下面的代码中,我试图将rDate分配给label11变量,但它一直抛出一个--对象引用,而该引用未设置为对象的实例。错误 if (e.Row.RowType == DataControlRowType.DataRow) {

我有一个名为“gvParentGrid”的父gridview,其中嵌套了名为“gvChildGrid”的gridview。我在父gridview-gvParentGrid中创建了一个行数据绑定事件

我正在尝试将label11分配给sql查询输出。在下面的代码中,我试图将rDate分配给label11变量,但它一直抛出一个--对象引用,而该引用未设置为对象的实例。错误

if (e.Row.RowType == DataControlRowType.DataRow)
        {
            con.Open();
            GridView gv = (GridView)e.Row.FindControl("gvChildGrid");

            Label lblorderID = (Label)e.Row.FindControl("Label2");

            Label lblRead = (Label)gv.FindControl("Label11");

            string userID = lblorderID.Text;

            string cmdstr = "select top 2 [rUID], count([rDATE]) as 'articles read' from ArticlesRead where [rUID] = @ID group by [rUID] order by count([rDATE]) desc";
            SqlCommand cmd = new SqlCommand(cmdstr, con);
            cmd.Parameters.AddWithValue("@ID", userID);

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);

            if (ds != null && ds.Tables[0].Rows.Count > 0)
            {
                // Line below causing the object reference error.
                ***lblRead.Text = ds.Tables[0].Rows[0][1].ToString();***
            }

            con.Close();

            gv.DataSource = ds;
            gv.DataBind();
        }
以下是客户端模板供进一步参考:

 <asp:GridView ID="gvParentGrid" runat="server" DataKeyNames="uID"  Width="300" AutoGenerateColumns="false" OnRowDataBound="gvUserInfo_RowDataBound">
 <asp:TemplateField HeaderText="ID" SortExpression="ID">
 <HeaderTemplate>
 <asp:Label ID="Label1" runat="server" Text="ID"></asp:Label><br />
 </HeaderTemplate>
 <ItemTemplate>
 <asp:Label ID="Label2" runat="server" Text='<%# Bind("uID") %>' >   </asp:Label>
</ItemTemplate>
</asp:TemplateField>
 <asp:GridView ID="gvChildGrid" runat="server" AutoGenerateColumns="false" DataKeyNames="uID">
<asp:TemplateField HeaderText="Articles Read">
<ItemTemplate>
<asp:Label ID="Label11" runat="server" Text=""></asp:Label>
</ItemTemplate>
</asp:TemplateField>



如有任何进一步建议,将不胜感激。谢谢

您不应该对数据集中的每一行执行数据库查询。您应该执行一次查询(这可能意味着只执行一次联接),构建一组完整的结果,用于绑定外部gridview和所有内部gridview,然后一次绑定所有内容。我还强烈建议不要使用RowDataBind事件。改为在标记中执行所有绑定。它不仅会鼓励您遵循我之前评论中的建议,而且更简单,只允许您利用提供给您的所有工具。如果您没有实际使用GridView的数据绑定功能,那么使用GridView没有多大意义。
lblRead
标签为NULL,在
if
条件下,您没有验证标签是否与NULL不同(因此,异常),并且在代码示例中,您丢失了更多代码,就像
GridView
中的
标记一样。请更新您的问题。