C# 将datatable绑定到自定义GridView控件会生成空引用异常

C# 将datatable绑定到自定义GridView控件会生成空引用异常,c#,asp.net,gridview,datatable,C#,Asp.net,Gridview,Datatable,将datatable绑定到自定义gridview控件时遇到问题。当我将数据绑定到控件时,遇到的问题是nullreference异常 当数据源是由SqlDataAdapter填充的datatable时,gridview绑定没有问题。下面是对我来说很有用的代码: public override void Load(DateTime startDate, DateTime endDate) { using (DataTable dt = new DataTable())

将datatable绑定到自定义gridview控件时遇到问题。当我将数据绑定到控件时,遇到的问题是nullreference异常

当数据源是由SqlDataAdapter填充的datatable时,gridview绑定没有问题。下面是对我来说很有用的代码:

    public override void Load(DateTime startDate, DateTime endDate)
    {
        using (DataTable dt = new DataTable())
        {
            using (dbCheckpointWarehouseDataContext thisDataContext = new dbCheckpointWarehouseDataContext())
            {
                var qryItemCount = [LINQ QUERY THAT WORKS FINE.]

                using (SqlCommand cmd = thisDataContext.GetCommand(qryItemCount) as SqlCommand)
                {
                    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                    {
                        adapter.Fill(dt);
                    }
                    if (dt.Rows.Count > 0)
                    {

                        CustomGridView cgvResults = new CustomGridView();
                        cgvResults.AddBoundField("DistrictManagerName", "District Manager", "");
                        cgvResults.AddBoundField("newMetric", "newMetric", "");
                        cgvResults.DataSource = dt;
                        cgvResults.DataBind();

                        m_ReportHTMLString = Utilities.RenderHTMLStringOfControl(cgvResults);
                    }
                }
            }
        }
    }
如果我尝试用强类型datatable加载同一个自定义控件,则会出现null引用异常。在我将datatable绑定到stock gridview控件的地方注释掉了三行。这也行得通。我只有在使用带有自定义gridview的强类型数据表时才会遇到这个问题。异常是在DataBind方法中生成的。在调试模式下,我验证了datatable不是空的,并且在设置DataSource属性时没有异常。以下是生成空引用的代码:

    public override void Load(DateTime startDate, DateTime endDate)
    {
        using (DataTable dt = new DataTable())
        {

            dt.Columns.Add("DistrictManagerName", typeof(string));
            dt.Columns.Add("newMetric", typeof(Int32));

            DataRow row;

            using (dbCheckpointWarehouseDataContext thisDataContext = new dbCheckpointWarehouseDataContext())
            {
                var qryItemCount = [LINQ QUERY THAT WORKS FINE.]
                                  .AsEnumerable()
                                  .Select([SELECT STATEMENT THAT WORKS FINE])


                foreach (var rowtrans in qryTest)
                {
                    row = dt.NewRow();
                    row["DistrictManagerName"] = rowtrans.DistrictManagerName;
                    row["newMetric"] = Convert.ToInt32(rowtrans.newMetric);
                    dt.Rows.Add(row);
                }

                string total = dt.Compute("Sum(newMetric)", "").ToString();

                row = dt.NewRow();
                row["DistrictManagerName"] = "Total";
                row["newMetric"] = String.Format("{0:#,0}", total);
                dt.Rows.Add(row);
                dt.AcceptChanges();

                CustomGridView cgvResults = new CustomGridView();
                cgvResults.AddBoundField("", "District Manager", "");
                cgvResults.AddBoundField("", "Total", "");
                cgvResults.DataSource = dt;
                cgvResults.DataBind();

                //GridView cgvResults = new GridView();
                //cgvResults.DataSource = dt.DefaultView;
                //cgvResults.DataBind();

                m_ReportHTMLString = Utilities.RenderHTMLStringOfControl(cgvResults);
            }
        }
    }
以下是自定义gridview控件的代码:

    public CustomGridView() : base()
    {
        AutoGenerateColumns = true;
        AllowPaging = true;
        AllowSorting = true;
        PageSize = 25;
        GridLines = GridLines.Vertical;
        CssClass = "gridView";
        HeaderStyle.CssClass = "gridViewHeader";
        RowStyle.CssClass = "gridViewRow";
        AlternatingRowStyle.CssClass = "gridViewAlternatingRow";
        PagerStyle.CssClass = "gridViewPager";
        CellPadding = 3;
    }

    public void AddBoundField(string dataField, string headerText, string sortExpression)
    {
        BoundField bf = new BoundField();

        if (dataField != "")
        {
            bf.DataField = dataField;
        }

        if (headerText != "")
        {
            bf.HeaderText = headerText;
        }

        if (sortExpression != "")
        {
            bf.SortExpression = sortExpression;
        }

        Columns.Add(bf);
    }

感谢您提供的任何帮助。

我找到了解决方案。我更改了设置:

AllowPaging = true

我的自定义控件现在可以正常工作了


我希望有人能够解释为什么此设置会在强类型数据集上导致NullReference异常。

作为旁白,没有必要对DataTable使用using语句,因为它只是在dataset designer上实现了IDisposable的拖放功能。这同样适用于数据集。谢谢你的建议。那是我VBA时代的一个顽固分子。
AllowPaging = false