【问题标题】:Page size causing error in gridview DataBind页面大小导致gridview DataBind中的错误
【发布时间】:2016-11-11 16:11:23
【问题描述】:

我遇到了一个奇怪的问题,或者我犯了一个愚蠢的错误。 我有一个包含五行的数据表。 我正在从代码隐藏创建一个网格视图。 对于分页,如果我指定Page size =5(数据表的大小)一切都很好,但是当我指定的页面大小小于数据表的大小时,例如Page size=2, 我得到了:

对象引用未设置为对象的实例。

gvEmployee.DataBind();

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace demogrid
{
    public partial class grid : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DataTable table = new DataTable();
                table.Columns.Add("Dosage", typeof(int));
                table.Columns.Add("Drug", typeof(string));
                table.Columns.Add("Patient", typeof(string));
                table.Columns.Add("Date", typeof(DateTime));

                // Here we add five DataRows.
                table.Rows.Add(25, "Indocin", "David", DateTime.Now);
                table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
                table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
                table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
                table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
                BindData(table);
            }
        }
        protected void BindData(DataTable dt)
        {
            GridView gvEmployee = new GridView();
            gvEmployee.AllowPaging = true;
            gvEmployee.PageSize = 5;//getting error if the page size is less than 5
            gvEmployee.AutoGenerateColumns = false;

            if (dt != null)
            {
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    BoundField boundfield = new BoundField();
                    boundfield.DataField = dt.Columns[i].ColumnName.ToString();
                    boundfield.HeaderText = dt.Columns[i].ColumnName.ToString();
                    gvEmployee.Columns.Add(boundfield);
                }
                gvEmployee.DataSource = dt;
                gvEmployee.DataBind();
                gvEmployee.Width = 600;
                gvEmployee.HeaderStyle.CssClass = "header";
                gvEmployee.RowStyle.CssClass = "rowstyle";

                Panel1.Controls.Add(gvEmployee);
            }
        }
    }
}

堆栈跟踪:

at System.Web.UI.WebControls.GridView.get_StateFormatter()
       at System.Web.UI.WebControls.GridView.BuildCallbackArgument(Int32 pageIndex)
       at System.Web.UI.WebControls.GridView.CreateNumericPager(TableRow row, PagedDataSource pagedDataSource, Boolean addFirstLastPageButtons)
       at System.Web.UI.WebControls.GridView.InitializePager(GridViewRow row, Int32 columnSpan, PagedDataSource pagedDataSource)
       at System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource)
       at System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding)
       at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data)
       at System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data)
       at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data)
       at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
       at System.Web.UI.WebControls.DataBoundControl.PerformSelect()
       at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
       at System.Web.UI.WebControls.GridView.DataBind()
       at demogrid.grid.BindData(DataTable dt) in c:\Users\sample\Documents\Visual Studio 2012\Projects\demogrid\demogrid\grid.aspx.cs:line 59
       at demogrid.grid.Page_Load(Object sender, EventArgs e) in c:\Users\sample\Documents\Visual Studio 2012\Projects\demogrid\demogrid\grid.aspx.cs:line 32

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 你确定这是抛出异常的那一行吗?或者它可能来自数据绑定本身的代码,例如页面上的内联绑定模板或数据绑定事件的事件处理程序?
  • 嗨,大卫,感谢您的回复,是的,我确定。我检查了这两种情况,只有当我将页面大小小于数据表大小的网格绑定时,我才会收到错误。跨度>
  • 好吧,如果这是抛出异常的那一行,那么不知何故 gvEmployee 就是 null。如果不是这种情况,那么这不是引发异常的行。

标签: c# asp.net gridview pagertemplate


【解决方案1】:


发生异常是因为您的 GridView 还不是 PAGE 上的控件,并且您正在调用 DataBind
您必须先在页面上添加控件数据绑定
而且您还必须实现 PageIndexChanging 事件来处理页面更改事件。

还有一件事是您需要将数据表代码从 if (!IsPostBack) 块中移出,因为当页面 POSTBACK 时它不会被执行,并且当页面时控件将不再在页面上被更改或任何 POSTBACK 事件被触发。 这是一个适合您的工作代码。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace demogrid
{
    public partial class grid : System.Web.UI.Page
    {
    GridView gvEmployee = new GridView();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {

        }
        DataTable table = new DataTable();
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));

        // Here we add five DataRows.
        table.Rows.Add(25, "Indocin", "David", DateTime.Now);
        table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
        table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
        table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
        table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
        BindData(table);
    }
    protected void BindData(DataTable dt)
    {
        gvEmployee.AllowPaging = true;
        gvEmployee.PageSize = 2;
        gvEmployee.AutoGenerateColumns = false;
        gvEmployee.PageIndexChanging += gvEmployee_PageIndexChanging;
        if (dt != null)
        {
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                BoundField boundfield = new BoundField();
                boundfield.DataField = dt.Columns[i].ColumnName.ToString();
                boundfield.HeaderText = dt.Columns[i].ColumnName.ToString();
                gvEmployee.Columns.Add(boundfield);
            }
            Panel1.Controls.Add(gvEmployee);
            gvEmployee.DataSource = dt;
            gvEmployee.DataBind();
            gvEmployee.Width = 600;
            gvEmployee.HeaderStyle.CssClass = "header";
            gvEmployee.RowStyle.CssClass = "rowstyle";

        }
    }

    void gvEmployee_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvEmployee.PageIndex = e.NewPageIndex;
        gvEmployee.DataBind();

    }


}
}

【讨论】:

  • 请分享您在此过程中遇到了什么问题或错误?
  • 我遇到了同样的错误,我已经共享了堆栈跟踪
  • 您可以在集成我的代码后分享您的代码吗?
  • UI .aspx PAGE = textsnip.com/buq3so CodeBehind = textsnip.com/xju8yr
  • 你解决了我的问题,即使是几年后。我在页面生命周期中移动了一些代码,基本上是添加控件,然后在生命周期的后期将其删除 derp。我希望这可能是一个捕获的异常,描述中有一些常见原因。
【解决方案2】:

这是因为没有为您的 GridView 设置分页模板。 我已经修改了您的代码以帮助您入门。首先添加 RowDataBound 处理程序并设置您的 Pager:

    protected void BindData(DataTable dt)
    {
        GridView gvEmployee = new GridView();
        gvEmployee.AllowPaging = true;
        gvEmployee.PageSize = 4;//this Will work now
        gvEmployee.AutoGenerateColumns = false;

        if (dt != null)
        {
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                BoundField boundfield = new BoundField();
                boundfield.DataField = dt.Columns[i].ColumnName.ToString();
                boundfield.HeaderText = dt.Columns[i].ColumnName.ToString();
                gvEmployee.Columns.Add(boundfield);
            }
            gvEmployee.DataSource = dt;
            gvEmployee.RowDataBound += gvEmployee_RowDataBound;
            gvEmployee.PagerTemplate = new MyTemplate();
            gvEmployee.DataBind();
            gvEmployee.Width = 600;
            gvEmployee.HeaderStyle.CssClass = "header";
            gvEmployee.RowStyle.CssClass = "rowstyle";

            Panel1.Controls.Add(gvEmployee);
        }
    }

    void gvEmployee_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        switch (e.Row.RowType)
        {
            case DataControlRowType.DataRow:
                break;
            case DataControlRowType.EmptyDataRow:
                break;
            case DataControlRowType.Footer:
                break;
            case DataControlRowType.Header:
                break;
            case DataControlRowType.Pager:
                //TODO: handle your pager...
                break;
            case DataControlRowType.Separator:
                break;
            default:
                break;
        }
    }

这是基本的寻呼机控件:

public class MyTemplate : WebControl, ITemplate
{
    public void InstantiateIn(Control container)
    {
        //TODO: create your pager controls...
    }
}

这样就可以了。

【讨论】:

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