2009-06-24 12 views
3

私は幸運なことなくいくつかの同様の質問を見てきました。私がしたいのは、特定の項目についてはリンクボタンを表示し、他の項目についてはハイパーリンクを表示するgridviewを持つことです。これは現在のコードです:プログラムでリンクボタンをgridviewに追加できますか?

public void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     var data = (FileDirectoryInfo)e.Row.DataItem; 
     var img = new System.Web.UI.HtmlControls.HtmlImage(); 
     if (data.Length == null) 
     { 
      img.Src = "/images/folder.jpg"; 
      var lnk = new LinkButton(); 
      lnk.ID = "lnkFolder"; 
      lnk.Text = data.Name; 
      lnk.Command += new CommandEventHandler(changeFolder_OnCommand); 
      lnk.CommandArgument = data.Name; 
      e.Row.Cells[0].Controls.Add(lnk); 
     } 
     else 
     { 
      var lnk = new HyperLink(); 
      lnk.Text = data.Name; 
      lnk.Target = "_blank"; 
      lnk.NavigateUrl = getLink(data.Name); 
      e.Row.Cells[0].Controls.Add(lnk); 
      img.Src = "/images/file.jpg"; 
     } 
     e.Row.Cells[0].Controls.AddAt(0, img); 
    } 
} 

最初のセルはTemplateFieldです。現在、すべてが正しく表示されますが、リンクボタンはCommandイベントハンドラを呼び出さず、ポストバックですべてのコントロールが消えます。

アイデア?

答えて

3

私はポストバック時にGridView の再バインドを強制してください。これにより、ダイナミックコントロールが再作成され、イベントハンドラが再接続されるようになります。これにより、ポストバック後の消滅も防げます。

IOWでは、ポストバック時にGridViewでDataBind()を呼び出します。

+0

このソリューションをお寄せいただきありがとうございます。私はちょうどそこに狂った提案されたソリューションのすべての種類のこの同じ問題を研究するために約1時間を費やしました...そして、これは単純にページ負荷のポストバックチェックを取り除くことに関与しています。 –

0

ボタンを宣言的に作成し、リテラルコントロールを使用して宣言的にハイフンを作成し、次にデータバインディング構文を使用して、コントロールのVisibleプロパティである可視性を必要に応じてtrueまたはfalseに設定します。

Visible='<%#((FileDirectoryInfo)Container.DataItem).Length == null) %>' 

何かがそうです。

1

また、これらをRow_Createdイベントに追加して元に戻す必要はありません!PostBackチェック

関連する問題