0

次のような GridView があります。

<asp:GridView ID="MyGridView" 
              runat="server" 
              AutoGenerateColumns="False" 
              OnRowDataBound="MyGridView_RowDataBound" >
   <asp:HyperLinkField . . . . . bla bla/>
   <asp:BoundField . . . . . . . bla bla/>
</asp:GridView>

私のイベント ハンドラー (MyGridView_RowDataBound) は、実質的に次のようになります。

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

   // do stuff here
}

何らかの理由で、私のコードは「// do stuff here」行に到達しません。OnRowDataBoundヘッダー行に対してのみ発火するため、データ行のチェックを通過しません。

MyGridView_RowCreatedハンドラーを使用してデータ行が作成されることを確認しました。Web サイトを実行すると、データベースの行が表示されるので、バインディングが行われていることも明らかです。MyGridView.DataBind()その上で、ステートメントが実行されていることを確認しました。

イベント ハンドラーがデータ行に対して起動しない原因となっているのは何ですか?

編集:さらに調べてみると、GridView.DataBoundイベントがまったく発生していないように見えるためDataBound、行を使用してループすることはできません。

4

2 に答える 2

1

バインディングプロセス中にキャッチされていたコードの奥深くで発生した例外がありました。バインディングが完全に終了しなかったため、OnRowDataBoundどのデータ行に対しても呼び出されることはありませんでした。バインディングが正常に完了したように見えたのは、結果が得られると期待していたすべてのセルに(バインディングが部分的に完了したために)それらがあり、問題のあるセルには期待どおりの結果が得られなかったためです。この例外を修正した後OnRowDataBound、各データ行に対して期待どおりに発生しました。

于 2012-08-29T23:38:58.600 に答える
0

作成==これ でデータ行が起動します

if (e.Row.RowType == DataControlRowType.DataRow)

グリッドビュー行の代替方法ループ

foreach (GridViewRow oItem in GridView1.Rows)
 {
    // do stuff here
    string value = oItem.Cells[0].Text;

 }
于 2012-08-28T10:00:43.050 に答える