列の型は GridView 全体に適用されるため、ここでは AutoGeneratedColumns プロパティは役に立たないようです。行ごとには計算されません。
データバインディングでTemplateFieldを使用して、コードを記述せずに各行のフィールドを条件付きでフォーマットできる場合があります。
それでもうまくいかない場合は、コードを作成する必要があると思います。RowCreated イベントは、行が作成されると常に発生します (ポストバックのイベントe.Row.DataItem
) が、GridView が実際にデータバインディングのために DataSource に移動する場合にのみ、null 以外の DataItem () を提供することに注意してください。GridView がレンダリングされた状態を (ViewState で) キャッシュした場合、データ項目は null になります。その時点で、次のようなことを行うことによってのみ、行の主キー フィールドにアクセスできます: var keys = myGridView.DataKeys[rowIndex];
(主キー フィールドは、GridView のプロパティに指定した値によって決定さDataKeyNames
れ、ViewState に格納されるため、ポストバック。)
また、(ほとんどのフィールドがそうであるように) ある種の DataBoundField である列を変更する場合も注意が必要です。RowDataBound イベントは RowCreated イベントの後に発生するため、RowCreated イベント ハンドラーで行/セルの内容を手動で変更すると、RowDataBoundが発生したときにデータ バインドによって上書きされます。
そうは言っても、RowDataBound はおそらく必要なイベントです。
RowDataBound イベントは常に null 以外の DataItem を提供しますが、(ViewState からの "バインディング" とは対照的に) 実際のデータ バインディングが発生した場合にのみ発生します。そのため、通常、このイベントはポストバックではまったく発生しません。ただし、GridView はその状態を覚えているので問題ありません。
コードを使用する必要がある場合は、おそらく次のようになります。
//don't forget to attach this event handler, either in markup
//on the GridView control, in code (say, in the Page_Init event handler.)
protected void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
//HtmlImage gives you a plain-vanilla <img> tag in the HTML.
//If you need to handle some server side events (such as Click)
//for the image, use a System.Web.UI.WebControls.Image control
//instead.
HtmlImage img = new HtmlImage() { Src = "path/to/image.jpg" };
e.Row.Cells[1].Controls.Add(img);
}
しかし、真剣に、最初に TemplateField をチェックしてください。