y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

ASP.NETでGridViewのセル値を加工したい

これまでのDataTableに加え、.NET2.0から登場したGridViewを使うと、ページング処理が自動的に生成されたり、Ajax的な動作をするので便利だ。
・・がしかし、DBから取得した値をグリッドにバインドする際、これまでやっていたように、関数に投げて値を整形する処理と両立しない。
具体的にはここにあるように「コールバックがTemplateField上でサポートされていません」という問題。
EnableSortingAndPagingCallbacks="True" をFalseにして、ページングによるコールバックを使わない(それは全く意味が無くなってしまうのであるが)ならば、TemplateFieldのバインド式を使って、任意のメソッドに投げられる。
さて、どうするか。
当初Ajax(MicrosoftAjaxToolKit)を使って、解決可能なように見えた。
しかし、考えていることが上手く実現できなかったので、別の実現方法で解決した。
それは
OnRowDataBoundイベント(1レコードバインドする度に発生するイベント)で、セルの内容を判定し、書き換えるという方法。

//データがグリッドにバインドされる際、値を評価して書き換える
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
string str = "";
string retstr = "";
if(e.Row.RowType==DataControlRowType.DataRow)
{

DataRowView drv =(DataRowView)e.Row.DataItem;

//値の加工
str=drv["フィールド名"].ToString();  //←フィールド名を探し
if ( str != "")
{
retstr=num2str("フィールド名", str); //←任意のメソッド
e.Row.Cells[6].Text = retstr;     //←列番号固定で値を代入
}

//まとめて処理するならループだね(列番号7〜12)
for (int i = 7; i < 13; i++)
{
if (e.Row.Cells[i].Text.ToString().Length > 1)
{
str = e.Row.Cells[i].Text.ToString();

}
else {
str = "0";
}

switch (str)
{
case "1":
retstr = "1の場合の文字列";
break;
case "2":
retstr = "2の場合の文字列";
break;
case "3":
retstr = "3の場合の文字列";
break;
case "4":
retstr = "4の場合の文字列";
break;
default:
retstr = str;
break;
}
e.Row.Cells[i].Text = retstr;
}