3

グリッドビューで動的コントロールを使用することで、ピクルスに陥りました。

グリッドビューをリストにバインドしてから、動的コントロールを追加しています。コントロールの状態を維持するには、ページの読み込み時にこれを行う必要があります。ただし、ページの読み込み後にイベントが発生するため、並べ替えとページングのイベントを適切に処理できません。この問題に対する創造的な解決策はありますか、それとも私はこれについてすべて間違っていますか?

編集:私は自分の問題を正しく説明したかどうかわかりません。動的コントロールをライフ サイクルのどこに追加するかは問題ではありません。問題は、並べ替えとページングのイベントで GridView を再バインドする必要があることです。これにより、(明らかに) 動的コントロールに割り当てられたプロパティが ViewState から失われます。これは、並べ替えとページングのバインドがライフ サイクルの後半で発生するためです。

protected void Page_Load(object sender, EventArgs e)
{       
   //NOTE: to maintain control state of dynamic controls all databinding needs to be done in page load. 
   grdProducts.DataSource = GetDataSource();
   grdProducts.DataBind();
}

protected void grdProducts_OnRowDatabound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow) return;        

    ManufacturerProduct m = new ManufacturerProduct();

    m.Model = DataBinder.Eval(e.Row.DataItem, "Model").ToString();

    PlaceHolder ph = new PlaceHolder();        
    ph = (PlaceHolder)e.Row.FindControl("phAddToCart");        

    LinkButton lb = new LinkButton();
    lb.Text = "Add To Cart";
    //NOTE: if I bind after page load the command never fires.      
    lb.Command +=  new CommandEventHandler(AddItem);
    lb.CommandName = "AddItem";
    lb.CommandArgument = m.Model;        
    ph.Controls.Add(lb);

}

protected void grdProducts_OnSorting(object sender, GridViewSortEventArgs e)
{
    //NOTE: since events fire after page load I can't handle this properly.

    hfSortExpression.Value = e.SortExpression.ToString();

    grdProducts.PageIndex = 0;
    //NOTE: If I rebind here I hose my dynamic controls
    //grdProducts.DataSource = GetDataSource();
    //grdProducts.DataBind();
}
4

4 に答える 4

1

さて、私にとっての答えは、私がどのように問題を攻撃したかを再考することでした。動的リンクボタンを削除し、代わりにボタンフィールドを追加しました。そうすれば、グリッドビューをどこにでもバインドでき、その制御状態は重要ではありません。これが私を助けてくれたページです。

http://msdn.microsoft.com/en-us/library/bb907626.aspx

于 2011-05-19T16:06:29.830 に答える
0

Page_Load() から次の 2 行を削除する必要があるのは間違いです。

grdProducts.DataSource = GetDataSource();
grdProducts.DataBind();

コントロールにデータソースを動的にバインドする場合、次のように OnInit をオーバーライドし、2 行を取得してそこに配置する必要があります。

protected override void OnInit(EventArgs e) {
   grdProducts.DataSource = GetDataSource();
   grdProducts.DataBind();
   base.OnInit(e);
}

次に、ページの ViewState の初期化前であるため、状態を維持します。トーマスが言ったように、彼がくれたリンクを見てください。

注 : 英語で申し訳ありません。私はケベック出身で、通常はフランス語を話します。

于 2011-05-17T17:01:58.550 に答える
0

複合コントロールの子コントロールを含む、ページをレンダリングするために必要なすべてのコントロールを Page オブジェクトが作成した後に、PreRenderページ
ASP.NET Page Life Cycle Overviewイベントが発生した場合に備えて、コードを記述する必要があります。
PreRender

于 2011-05-17T16:43:03.277 に答える
0

OnRowCreated動的コントロールを追加してそれらの状態を処理できるようにするには、GridViewのイベントを使用する必要があります。このOnRowCreatedイベントは、ポストバックごと、ページのロード前、およびDataBind()グリッドでメソッドを呼び出すたびに自動的に発生します。

イベントには、実際のデータバインディングのみを含める必要がありますOnRowDatabound

また、ポストバックごとにグリッドを再バインドしないでください。

于 2011-05-17T16:52:44.950 に答える