簡體   English   中英

使用C#.ASP中的動態/編程創建的網格視圖啟用分頁

[英]Enable Paging with Dynamically/Programmatically created Grid View in C# .ASP

我在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: 

我搜索了這個網站。

如何在動態網格視圖中創建分頁

上面的帖子沒有提供動態創建的GridView的答案。 它僅適用於GridView在設計時拖放。 我對GridView不太熟悉。 所以任何幫助都表示贊賞。

謝謝。

動態創建這樣復雜的控件並在回發期間維持其狀態可能非常困難。 我真的建議您在聲明性代碼中靜態創建控件,並在必要時僅將其Visible設置為true / false。

動態添加的控件將僅持續當前請求。 如果您在此頁面上使用分頁或任何其他操作(!),則會將回發發送到服務器。 新請求將再次重新創建頁面對象,而不創建動態添加的控件。 此行為是有目的的,因為回發請求可能會發送到服務器場中的另一個服務器。 由於您沒有在其他地方存儲有關gridview的存在信息(例如,在ViewState中),因此服務器無法在新請求上重建它。

總之,您必須自己維護控件的狀態和重建(如果您不熟悉頁面循環,查看狀態等,則非常棘手)。 另外,您遵循Wiktor並在聲明性代碼中靜態創建網格視圖,並使用可見性標記(強烈推薦)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM