1

選択したオプションのセットに基づいて作成されたクエリによって設定される DataTable に動的にバインドする GridView コントロールがあります。

私がやろうとしているのは、データベース フィールドの値に基づいて特定の行をフォーマットするために、単純に RowDataBound イベントを処理することです。このイベント ハンドラのコードは正常に動作します。私の問題は、このイベントを呼び出すと、最初の行がバインドされた後に DataTable にバインドした後に Gridview が停止したかのように、GridView が DataTable の最初のレコードのみを表示することです。

ハンドラーを動的に追加しようとしましたが、同じ結果が得られます。

このイベントを処理するだけで Gridview がこれを行う理由についてのアイデアはありますか?

十分なデータが返されるという事実を知っています (DataTable はすべてのレコードでいっぱいになり、RowDataBound イベントに触れていない場合、GridView はすべてのレコードを正常に表示します)。

クエリを生成し、DataTable に入力し、GridView をバインドした直後にハンドラーを追加しています。

oDA.Fill(oDTbl)
figs_gv.DataSource = oDTbl
figs_gv.DataBind()
AddHandler figs_gv.RowDataBound, AddressOf gvRowDataBound 

ハンドラー自体:

Protected Sub gvRowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.DataRow Then
        If (e.Row.DataItem("Have") = "Yes") Then
            For i As Integer = 1 To e.Row.Cells.Count
                e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
            Next
        End If
    End If

End Sub

また、RowDataBound を処理するときに、GridView の DATABOUND イベントが発生しないことも確認しました。最初の行をバインドした直後にバインドを停止するようです。

4

1 に答える 1

1

問題を解決しました。

コードをステップ実行すると、次のように各行のセルをループすると、「インデックスが範囲外です」というエラーが発生することがわかりました。

For i As Integer = 1 To e.Row.Cells.Count
     e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
Next

次の行に移動する前に、例外がスローされていました。最初のセルをスキップして、後続のすべてのセルにのみ背景色を適用したかったので、セルの数よりも 1 つ少ない数にループするように設定する必要がありました。

For i As Integer = 1 To e.Row.Cells.Count - 1
     e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
Next
于 2011-06-29T05:25:48.643 に答える