1

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();」を持っている理由です。つまり、ユーザーがボタンをクリックせずにボタン イベントを発生させた場合、ファイルへのすべての URL リンクを含む GridView は表示されません。

「gv」が作成され、ページングが有効になると、gv が PanelConfigure (パネルのタイプ) に追加されます。その後、ユーザーはすべてのファイル リンクを表示できます。

「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 にあまり詳しくありません。そのため、どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

1

動的に追加されたコントロールは、現在のリクエストに対してのみ持続します。このページでページングまたはその他のアクション (!) を使用すると、ポストバックがサーバーに送信されます。新しいリクエストは、動的に追加されたコントロールを作成せずに、ページ オブジェクトを再作成します。ポストバック要求がサーバー ファーム内の別のサーバーに送信される可能性があるため、この動作は意図的なものです。グリッドビューに関する存在情報を別の場所 (ViewState など) に保存していないため、サーバーは新しい要求でそれを再構築できません。

結論として、状態を維持し、コントロールの再構築を自分で行う必要があります (ページ サイクル、ビュー ステートなどに慣れていない場合、非常にトリッキーです)。または、Wiktor に従い、宣言型コードでグリッド ビューを静的に作成し、可視性フラグを使用します (強くお勧めします)。

于 2013-08-15T09:42:04.677 に答える