简体   繁体   English

页面大小导致gridview DataBind中的错误

[英]Page size causing error in gridview DataBind

I am facing a strange issue or maybe i am doing a silly mistake. 我面临一个奇怪的问题,或者我犯了一个愚蠢的错误。 I have a datatable which contains five rows. 我有一个包含五行的数据表。 I am creating a gridview from codebehind. 我正在从后台代码创建一个gridview。 for pagination if i specify Page size =5 (the size of datatable) everything is fine but when i specify the page size less than the size of the datatable eg Page size=2 , I am getting : 对于分页,如果我指定Page size =5 (数据表的大小),一切都很好,但是当我指定页面大小小于数据表的大小(例如Page size=2 ,我得到:

Object reference not set to an instance of an object. 你调用的对象是空的。

in gvEmployee.DataBind(); 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);
            }
        }
    }
}

StackTrace: 堆栈跟踪:

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

Any help would be appreciated. 任何帮助,将不胜感激。

Thanks in advance. 提前致谢。


The Exception is occurring because your GridView is not a control on PAGE yet and your are calling DataBind . 发生异常是因为您的GridView尚未在PAGE上进行控制,并且您正在调用DataBind
You must add the control on the page before you databind . 绑定数据之前,必须在页面上添加控件
And Also you must implement PageIndexChanging Event to handle Page Changing Event. 而且,您还必须实现PageIndexChanging事件以处理页面更改事件。

One more thing is that you need to move your datatable code from if (!IsPostBack) block, because it wont be executed when Page POSTBACK and control wont be on page anymore when page is changed or any POSTBACK event is fired. 还有一件事是,您需要从if(!IsPostBack)块中移出数据表代码,因为当Page POSTBACK发生更改时,它将不再执行,而在页面更改或触发任何POSTBACK事件时,控件将不再位于页面上。 Here is a working code for you. 这是适合您的工作代码。

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();

    }


}
}

This is caused because no Pager Template is set to your GridView. 这是因为没有将Pager模板设置为您的GridView。 I have modified your code to get you started. 我已修改您的代码以开始使用。 First add RowDataBound handler and set your Pager: 首先添加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;
        }
    }

And here is basic Pager control: 这是基本的分页器控件:

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

This will do the job. 这样就可以了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM