[英]Page size causing error in gridview DataBind
我面臨一個奇怪的問題,或者我犯了一個愚蠢的錯誤。 我有一個包含五行的數據表。 我正在從后台代碼創建一個gridview。 對於分頁,如果我指定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
任何幫助,將不勝感激。
提前致謝。
發生異常是因為您的GridView尚未在PAGE上進行控制,並且您正在調用DataBind 。
綁定數據之前,必須在頁面上添加控件 。
而且,您還必須實現PageIndexChanging事件以處理頁面更改事件。
還有一件事是,您需要從if(!IsPostBack)塊中移出數據表代碼,因為當Page 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();
}
}
}
這是因為沒有將Pager模板設置為您的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...
}
}
這樣就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.