8

ASP.NET ページで、LINQ クエリの結果が取り込まれた GridView があります。コードで DataSource を設定してから、DataBind を呼び出しています。GridView の RowDataBound イベントでは、クエリ結果に基づいて一部の GridView フィールドのリンクを選択的に非表示にしています。(たとえば、親行がない問題の行の「親を表示」リンクを非表示にします。)

これは最初はうまくいきます。しかし、ポストバック ( DataBind を呼び出さないが、GridView は ViewState を介して設定されたままの場合) では、データは表示されますが、RowDataBound イベントは (明らかに) 発生せず、リンクは非表示になりません。

ポストバック後にリンクを非表示にする最良の方法は何ですか?

4

8 に答える 8

2

これが私がこれを解決することになった方法です:

  1. 行のPKと、有効かどうかを示す各リンクのブール値という読み取り専用プロパティを使用して、シリアル化可能なクラスを作成しました。それを呼びますLinkVisibility
  2. 上記のクラスのインスタンスを保持するために、KeyedCollectionを継承するシリアル化可能なクラスを作成しました。
  3. そのコレクションのインスタンスを保持するViewStateに裏打ちされたプロパティを作成しました。
  4. 検索手順(GridViewへの入力)で、コレクションをクリアします。
  5. 最初にリンクを表示/非表示にするRowDataBoundで、LinkVisibility各行のコレクションにインスタンスを追加します。
  6. Page.Loadで、IsPostBackがtrueの場合、GridView行をループします。コレクション内のPKでそれぞれを検索しLinkVisibility(DataKeyNamesはGridViewで設定されます)、それに応じてリンクを設定します。

これが最善の方法かどうかはわかりませんが、確かに機能します。これは、私が試した他のどの方法よりも優れています。

于 2008-11-12T21:33:15.103 に答える
1

1) grid_DataBound(...) で一度呼び出されるメソッド - ProcessDataRows() を持つことができます。そして、PostBack の後で必要になったときに。

そうすれば、必要なときにすべての行を処理できます。

2) ShowParentLink() のようなメソッドを持つことができます。次に、グリッド内の LinkBut​​ton にバインドされ (ItemTemplate を使用している場合)、リンクには

Visible='<%#ShowParentLink()%>'
于 2008-11-11T18:31:56.093 に答える
0

ページは、以前とまったく同じように再構築されない限り、ポストバックイベントを処理できません(ポストバック)。page-init中にリンクを再度非表示にすると、クリックイベントなどが発生するはずです。残念ながら、いくつかのサンプルコードを見ないと、これ以上具体的にすることはできません。

また、データバインディングがないため、データRowDataBoundは起動しません。より良い言葉がないため、viewstate-「viewstatebinding」からページを再構築しています。

于 2008-11-11T19:24:06.707 に答える
0
void Process Rows()
{
    ... do something
    ... process complete
    datagrid.DataBind();
}
于 2009-02-05T13:01:26.117 に答える
0

ビューステートには、リンクの一部を削除したという事実も反映されると予想していました (ビューステートが保存される前にリンクが削除されたと仮定します)。

「削除されたリンクがビューステートに表示されるのはなぜですか?」という質問が必要になるかもしれません。

于 2008-11-11T15:31:17.173 に答える
0
protected void btnHazardRating_Click(object sender, EventArgs e)
{
    gvPanelRole.RowDataBound += new GridViewRowEventHandler(gvPanelRole_RowDataBound);

    gvPanelRole.DataSource = dtGo;
    gvPanelRole.DataBind();
    ModalPopup.Show();

}
于 2012-03-30T10:31:11.303 に答える
0

別の解決策は、「ShowParentLink」のようなブール型の LINQ フィールドになるように、ロジックを LINQ クエリに入れることです。次に、HyperLink フィールドの Visible プロパティをその値にバインドするだけです。RowDataBound は必要ありません。

于 2008-11-12T02:23:52.740 に答える