【ASP.NET開発】菜鳥時代の.Netノート[about GridView]
6199 ワード
.netノートは『ASP.NET 2.0第一歩』から抜粋し、原作者の指導に感謝する.
初心者がデータを表示するとき、GridViewコントロールが一番よく使われると思います.このブログではGridViewの使い方についてお話しします.
本文
初心者がデータを表示するとき、GridViewコントロールが一番よく使われると思います.このブログではGridViewの使い方についてお話しします.
本文
1.GridViewのボタンイベントを設定する
GridViewのボタンがクリックされるとRowCommandイベントがトリガーされ、異なるボタンに異なるCommandNameを設定することでイベントをトリガーするボタンを区別できます.
eg:
イベント内のコード:if(e.CommandName=="Del")
{
int iIndex=Convert.ToInt16(e.CommandArgument);
Response.Write(iIndex+1);
}
ここではまずコマンド名に基づいてトリガイベントのボタンを区別し,e.CommandArgumentからトリガイベントの行インデックス番号を取得する.
2.選択した行のプライマリ・キーの取得方法
GridViewはデータテーブルのプライマリ・キーとしてGridViewの属性を設定し、複数のプライマリ・キーがある場合はカンマで区切る、コードでこの属性を使用してプライマリ・キーを取得するDataKeyの集合を提供する.DataKey[iIndex];
プライマリ・キーの値があれば、削除操作はずっと簡単です.
注:操作が終了したら、すぐにデータ・ソースを再指定し、バインド・メソッドを使用して再バインドします.
削除操作については、通常、スクリプト言語で書くことができるユーザ確認ダイアログボックスを追加します.また、このカラムをテンプレートカラムに変換した後、バックグラウンドで選択したインデックス番号を取得するためにインデックス番号を手動でバインドし、CommandArgument='<%#Containerを使用する必要があります.DataItemIndex%>'インデックス番号をバインドします.うん、そうだったはずだ.
3.RowCommandでGridView行のプライマリ・キー以外のデータを取得する方法
(1)方法1:コントロールのCommandArgumentを手動で指定する
この方法の原理はボタンのCommandArgumentにデータを直接バインドすることであり,欠点は1つのデータしかバインドできないことである.eg:CommandArgument='<%# Eval("UserName") %>'
(2)メソッド2:GridViewから直接値を取得する
この方法の利点は複数の値を取得できることであり,欠点は値がGridViewに表示されなければならないことである.私たちが唯一知っているパラメータは、行のインデックス番号です.
eg: int iIndex= Convert.ToInt16(e.CommandArgument);
GridViewRow gvr = GridView1.Rows[iIndex];
string sUserName = GridView1.Cells[0].Text;
// Hyperlink, FindControl ID ( Control ) Hyperlink , 。Hyperlink Cell ,Cell DataGridView 。
string sUserEmail = (GridView1.Cells[1].FindControl("HyperLink1") as HyperLink).Text;
(3)メソッド3:非表示ドメインを使用して値を保存する
利点は、データがデータソース内の任意のデータであってもよく、GridViewにバインドされたデータが必ずしも必要ではないことであり、大きなデータを格納しすぎないとページ体積が急激に増加するという欠点がある.
eg:
' />
RowCommandイベントコード:int iIndex= Convert.ToInt16(e.CommandArgument);
GridViewRow gvr = GridView1.Rows[iIndex];
string sUserName = (gvr.FindControl("hid_UserName") as HtmlInputHidden).Value;
(4)メソッド4:データ・ソースから値を再取得する
この方法の利点は、バインドに制限されないことですが、データベースにもう一度アクセスするという欠点も明らかです.個人的にはお勧めしません.
4.GridViewのフォーマット
GridViewのデータをフォーマットする理由
GridViewに表示されるデータは、直接データベースに格納されているデータではない場合があります.たとえば、性別を格納する場合、男性を1、女性を0で表すのが一般的ですが、GridViewでは0または1を直接表示することはできません.そのため、データベースから読み込まれたデータ、つまりバインドされたデータソースのデータをフォーマットする必要があります.
どうやってGridViewをフォーマットしますか?
(1)方法1:GridViewのバインド列にDataFormatString属性を使用してフォーマットする
eg: {0}" />
この列が斜体字で表示されているのが見えます.
(2)メソッド2:GridViewのテンプレート列のバインドラベルに各種演算と式を直接使用してフォーマットする
eg:
<%# Eval("UserName").ToString()*1123/1234+100 %>
(3)メソッド3:GridViewのテンプレート列のバインドラベルにバックグラウンドメソッドを呼び出してフォーマットする
実はこの方法は方法2とよく似ていて、データのフォーマットコードをバックグラウンドに置くだけです.
eg:
<%# DealData(Eval("UserName").ToString()) %>
バックグラウンドコード:
int DealData(string str)
{
return 0;
}
(4)方法4:GridViewのバインドイベント処理方法RowDataBoundでデータソースのデータを読み出しGridViewに値を付与する
eg: GridViewRow gvr=e.Row;
if(gvr.RowType == DataControlRowType.DataRow)
{
string sUserName = DataBinder.Eval(gvr.DataItem,"UserName").ToString();
gvr.Cells[0].Text = string.Format("<i>{0}</i>",sUserName);
}
現在のバインド行のGridViewをe.Rowから直接入手できます.注意:GridViewバインド中にRowDataBoundがバインドされるたびにトリガーされます.そして、この行がデータ行(ヘッダー行や脚注行ではなく)であるかどうかを判断し、そうであればGridViewRowのDataItemからデータ行を取得し、フォーマットしてsUserName文字列に付与し、最後にGridViewRowの最初の列に文字列を表示すればよい.また,ここでは各種の権限判断を行い,異なるユーザに対して異なるデータを表示することができる.
イベント内のコード:
if(e.CommandName=="Del")
{
int iIndex=Convert.ToInt16(e.CommandArgument);
Response.Write(iIndex+1);
}
ここではまずコマンド名に基づいてトリガイベントのボタンを区別し,e.CommandArgumentからトリガイベントの行インデックス番号を取得する.
2.選択した行のプライマリ・キーの取得方法
GridViewはデータテーブルのプライマリ・キーとしてGridViewの属性を設定し、複数のプライマリ・キーがある場合はカンマで区切る、コードでこの属性を使用してプライマリ・キーを取得するDataKeyの集合を提供する.DataKey[iIndex];
プライマリ・キーの値があれば、削除操作はずっと簡単です.
注:操作が終了したら、すぐにデータ・ソースを再指定し、バインド・メソッドを使用して再バインドします.
削除操作については、通常、スクリプト言語で書くことができるユーザ確認ダイアログボックスを追加します.また、このカラムをテンプレートカラムに変換した後、バックグラウンドで選択したインデックス番号を取得するためにインデックス番号を手動でバインドし、CommandArgument='<%#Containerを使用する必要があります.DataItemIndex%>'インデックス番号をバインドします.うん、そうだったはずだ.
3.RowCommandでGridView行のプライマリ・キー以外のデータを取得する方法
(1)方法1:コントロールのCommandArgumentを手動で指定する
この方法の原理はボタンのCommandArgumentにデータを直接バインドすることであり,欠点は1つのデータしかバインドできないことである.eg:CommandArgument='<%# Eval("UserName") %>'
(2)メソッド2:GridViewから直接値を取得する
この方法の利点は複数の値を取得できることであり,欠点は値がGridViewに表示されなければならないことである.私たちが唯一知っているパラメータは、行のインデックス番号です.
eg:
int iIndex= Convert.ToInt16(e.CommandArgument);
GridViewRow gvr = GridView1.Rows[iIndex];
string sUserName = GridView1.Cells[0].Text;
// Hyperlink, FindControl ID ( Control ) Hyperlink , 。Hyperlink Cell ,Cell DataGridView 。
string sUserEmail = (GridView1.Cells[1].FindControl("HyperLink1") as HyperLink).Text;
(3)メソッド3:非表示ドメインを使用して値を保存する
利点は、データがデータソース内の任意のデータであってもよく、GridViewにバインドされたデータが必ずしも必要ではないことであり、大きなデータを格納しすぎないとページ体積が急激に増加するという欠点がある.
eg:
' />
RowCommandイベントコード:
int iIndex= Convert.ToInt16(e.CommandArgument);
GridViewRow gvr = GridView1.Rows[iIndex];
string sUserName = (gvr.FindControl("hid_UserName") as HtmlInputHidden).Value;
(4)メソッド4:データ・ソースから値を再取得する
この方法の利点は、バインドに制限されないことですが、データベースにもう一度アクセスするという欠点も明らかです.個人的にはお勧めしません.
4.GridViewのフォーマット
GridViewのデータをフォーマットする理由
GridViewに表示されるデータは、直接データベースに格納されているデータではない場合があります.たとえば、性別を格納する場合、男性を1、女性を0で表すのが一般的ですが、GridViewでは0または1を直接表示することはできません.そのため、データベースから読み込まれたデータ、つまりバインドされたデータソースのデータをフォーマットする必要があります.
どうやってGridViewをフォーマットしますか?
(1)方法1:GridViewのバインド列にDataFormatString属性を使用してフォーマットする
eg:
この列が斜体字で表示されているのが見えます.
(2)メソッド2:GridViewのテンプレート列のバインドラベルに各種演算と式を直接使用してフォーマットする
eg:
<%# Eval("UserName").ToString()*1123/1234+100 %>
(3)メソッド3:GridViewのテンプレート列のバインドラベルにバックグラウンドメソッドを呼び出してフォーマットする
実はこの方法は方法2とよく似ていて、データのフォーマットコードをバックグラウンドに置くだけです.
eg:
<%# DealData(Eval("UserName").ToString()) %>
バックグラウンドコード:
int DealData(string str)
{
return 0;
}
(4)方法4:GridViewのバインドイベント処理方法RowDataBoundでデータソースのデータを読み出しGridViewに値を付与する
eg:
GridViewRow gvr=e.Row;
if(gvr.RowType == DataControlRowType.DataRow)
{
string sUserName = DataBinder.Eval(gvr.DataItem,"UserName").ToString();
gvr.Cells[0].Text = string.Format("<i>{0}</i>",sUserName);
}
現在のバインド行のGridViewをe.Rowから直接入手できます.注意:GridViewバインド中にRowDataBoundがバインドされるたびにトリガーされます.そして、この行がデータ行(ヘッダー行や脚注行ではなく)であるかどうかを判断し、そうであればGridViewRowのDataItemからデータ行を取得し、フォーマットしてsUserName文字列に付与し、最後にGridViewRowの最初の列に文字列を表示すればよい.また,ここでは各種の権限判断を行い,異なるユーザに対して異なるデータを表示することができる.