我在C#.ASP 2010中动态创建的网格视图中启用分页时遇到问题。
protected void ButtonViewFiles_Click(object sender, EventArgs e)
{
ClearPanelConfigure();
/*
logic to populate variable "gridviewlist" which is a type of List<string>
...
*/
gv = new GridView();
gv.ShowHeader = false;
gv.BorderWidth = 0;
gv.ForeColor = CONTROL_FONT_COLOR;
gv.PageSize = 10;
gv.RowDataBound += new GridViewRowEventHandler(GridView_OnRowDataBound);
gv.AllowPaging = true;
gv.PageIndexChanging += new GridViewPageEventHandler(GridView_PageIndexChanging);
if (gridviewlist.Count > 0)
{
gv.DataSource = gridviewlist;
gv.DataBind();
PanelConfigure.Controls.Add(gv);
mySession.SaveSessionObject(gridviewlist, "GridViewList");
}
}
protected void GridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gv.PageIndex = e.NewPageIndex;
gv.DataBind();
}
// Enable HTML decode for each cell in the gridview rows.
protected void GridView_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int c = 0; c < e.Row.Cells.Count; c++)
{
e.Row.Cells[c].Text = Server.HtmlDecode(e.Row.Cells[c].Text);
}
}
}
与大多数人在设计时拖放GridView控件不同,我的情况下的Gridview必须在运行时以编程方式创建。这就是为什么我有“gv = new GridView();”换句话说,如果用户没有点击按钮并触发按钮事件,我将不会向GridView显示文件的所有URL链接。
创建“gv”并使用分页启用后,gv将添加到PanelConfigure(Panel类型)。然后用户将能够查看所有文件链接。
“gv”是一个全局变量,否则“gv”将无法在
中编译 protected void GridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gv.PageIndex = e.NewPageIndex;
gv.DataBind();
}
对于在设计时拖放GridView的人来说,这不是问题。因为“gv”是用全局范围定义的。
如果我不在“gv”中启用分页。 Web应用程序至少运行并一次性显示所有文件。但是,如果我在运行时使用“gv.AllowPaging = true;”启用分页,则抛出异常,指向“gv.DataBind();”在按钮事件处理函数
中 protected void ButtonViewFiles_Click(object sender, EventArgs e)
{
...
gv.DataBind();
...
}
异常说:NullReferenceException未被用户代码处理。对象引用未设置为对象的实例。
System.NullReferenceException未被用户代码
处理 HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=System.Web
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 DataSearcher.advanced.ButtonViewFiles_Click(Object sender, EventArgs e) in C:\Users\fgui\documents\visual studio 2010\Projects\DataSearcher\DataSearcher\Advanced.aspx.cs:line 1853
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
我搜索了这个网站。
how to create paging in a dynamic gridview
上面的帖子没有提供动态创建的GridView的答案。它仅适用于GridView在设计时拖放。我对GridView不太熟悉。所以任何帮助都表示赞赏。
感谢。
答案 0 :(得分:2)
动态创建这样复杂的控件并在回发期间维护它们的状态可能非常困难。我真的建议您在声明性代码中静态创建控件,并在必要时将其Visible设置为true / false。
答案 1 :(得分:1)
动态添加的控件将仅针对当前请求。如果您在此页面上使用分页或任何其他操作(!),则会将回发发送到服务器。新请求将再次重新创建页面对象,而不创建动态添加的控件。 此行为是有目的的,因为回发请求可能会发送到服务器场中的另一个服务器。由于您没有在其他地方(例如在ViewState中)存储有关gridview的存在信息,因此服务器无法在新请求中重建它。
总之,您必须自己维护控件的状态和重建(如果您不熟悉页面循环,查看状态等,则非常棘手)。 另外,您遵循Wiktor并在声明性代码中静态创建网格视图并使用可见性标记(强烈推荐)。