RowDataBound イベントでグリッドビューのセルから値を取得する

string percentage = e.Row.Cells[7].Text;

GridViewで動的なことをしようとしているので、RowDataBoundイベントにいくつかのコードを配線しています。TemplateFieldである特定のセルから値を取得しようとしています。しかし、上記のコードは常に空の文字列を返しているようです。

何かアイデアはありませんか?

わかりやすくするために、問題のセルを少し紹介します。

<asp:TemplateField HeaderText="# Percentage click throughs">
<ItemTemplate>
    <%# AddPercentClickThroughs((int)Eval("EmailSummary.pLinksClicked"), (int)Eval("NumberOfSends")) %>
</ItemTemplate>
</asp:TemplateField>

これに関連して、誰か行のセルを選択する良い方法を知っていますか?cell[1]と入力するのは最悪です。cell["mycellname"]とすれば、セルの順番を変更してもバグが出ないのではないでしょうか?

は、データソースから直接データを引き出すことができます。

DataBinder.Eval(e.Row.DataItem, "ColumnName")
解説 (4)

テンプレートフィールドを使用し、リテラルテキストをバインドすると、asp.net は実際にコントロールを挿入してくれます。これは DataBoundLiteralControl に挿入されます。これは、デバッガで、空のテキストを取得しているコードの行の近くを見ればわかります。

つまり、コントロールを使うようにテンプレートを変更せずに情報にアクセスするには、次のようにキャストします。

string percentage = ((DataBoundLiteralControl)e.Row.Cells[7].Controls[0]).Text;

これでテキストが表示されます。

解説 (2)
ソリューション

まず、コードを Label または Literal コントロールで囲み、適切に参照できるようにする必要があります。テキストに関連するコントロールがないので、システムがそれを追跡する方法がありません。コントロールの内容をviewstateに追加するのはコントロールの責任です。

そのためには、gridView.FindControl("controlName");を使って、行内のコントロールを取得する必要があります。そこから Text などのプロパティを取得することができます。

また、問題の行のDataItemプロパティを取得し、適切なタイプにキャストして、直接情報を抽出することもできます。

解説 (3)