ASP.NET Nested GridView,DataItem在子GridView的RowDataBound事件中返回null

时间:2011-01-08 09:26:46

标签: asp.net gridview

在嵌套的GridView中(GridView在父GridView的模板列中)。我将子GridView绑定到父GridView的RowDataBound事件中的DataTable。这应该是有效的。但我遇到的问题是在Child GridView的RowDataBound事件中,当我尝试访问e.Row.DataItem属性时,它返回null。我期待它返回DataRowView类型。我将用它来设置TextBox的值。

父GridViewId = gvProductOptionGrps和 子GridViewId = gvProductOptions

父GridViews RowDataBound事件。

    protected void gvProductOptionGrps_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //ProductOptionGrps
            TextBox txtProductOptionGrpSortOrder = (TextBox)e.Row.FindControl("txtProductOptionGrpSortOrder");
            Label lblProductOptionGrpName = (Label)e.Row.FindControl("lblProductOptionGrpName");
            DataRowView drv = (DataRowView)e.Row.DataItem;

            txtProductOptionGrpSortOrder.Text = drv["SortOrder"].ToString();
            lblProductOptionGrpName.Text = drv["Name"].ToString();

            //ProductOptions
            SqlCommand sqlCmd = new SqlCommand();
            sqlCmd.CommandText = "SELECT a.ProductOptionId,a.SortOrder,b.Name,b.PriceGBP" +
                                 " FROM ProductOptionGrpProductOptions a" +
                                 " INNER JOIN ProductOptions b ON a.ProductOptionId=b.ProductOptionId" +
                                 " WHERE a.ProductOptionGrpId=@ProductOptionGrpId" +
                                 " ORDER BY a.SortOrder";
            sqlCmd.CommandType = CommandType.Text;
            sqlCmd.Parameters.Add("@ProductOptionGrpId", SqlDbType.UniqueIdentifier).Value = new Guid(drv["ProductOptionGrpId"].ToString());
            _fl.ConnectToSQLServer();
            sqlCmd.Connection = _fl.GetActiveSQLServerConnection();

            DataTable dtProductOptions = new DataTable();
            dtProductOptions.Load(sqlCmd.ExecuteReader());

            GridView gv = (GridView)e.Row.FindControl("gvProductOptions");
            gv.DataSource = dtProductOptions;
            gv.DataBind();
            _fl.DisconnectFromSQLServer();
        }
    }

    protected void gvProductOptions_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        TextBox txtProductOptionSortOrder = (TextBox)e.Row.FindControl("txtProductOptionSortOrder");
        TextBox txtPriceGBP = (TextBox)e.Row.FindControl("txtPriceGBP");
        DataRowView drv = (DataRowView)e.Row.DataItem;//returns null

        txtProductOptionSortOrder.Text = drv["SortOrder"].ToString();//Error
        txtPriceGBP.Text = drv["PriceGBP"].ToString();//Error
    }

1 个答案:

答案 0 :(得分:3)

您忘记在gvProductOptions_RowDataBound中检查Row是否为DataRow。 Header没有DataItem,因此它为null。

if (e.Row.RowType == DataControlRowType.DataRow)
相关问题