GridViewのCommandコマンドセット
38803 ワード
Asp.Net 2.0に新たに追加されたgridviewコントロールは、非常に強力なデータ展示コントロールであり、前のシリーズの文章では、それぞれ多くの基本的な使い方とテクニックを示しています(詳細は<>>、<>を参照).本稿では,関連するテクニックについて引き続き検討する.
一、Gridviewの内容をExcelにエクスポートする
日常の仕事の中でgridviewの中の内容をexcelレポートにエクスポートすることがよくあります.asp.Net 2.0では、gridview全体のコンテンツをexcelレポートにエクスポートすることも容易に実現できます.次に、その具体的な方法を説明します.
まず、基本的なページdefaultを作成します.aspx
ここでaspx.csには、次のコードが書き込まれます.
上記のコードでは、まずgridviewを指定したデータソースにバインドし、button 1のボタン(EXCELにエクスポートするための)のイベントに関連するコードを書き込みます.ここではResponseを使用する.AddHeader("content-disposition","attachment;filename=exporttoexcel.xls");のfilenameでエクスポートするexcelのファイル名を指定します.ここでexporttoexcelです.xls.注意すべきは、gridviewの内容はページングで表示される可能性があるため、ここではexcelをエクスポートするたびにgridviewのallowpagingプロパティをfalseに設定し、ページフローで現在のページのgridviewをexcelにエクスポートし、最後にallowpagingプロパティを再設定します.また、実行時に指定するASPであることを確認するために、空のVerifyRenderingInServerFormメソッド(必ず書く)を書くことに注意してください.NETサーバコントロールはHtmlFormコントロールを表示します.
二、gridviewの各種コントロールにアクセスする
gridviewではdropdownlist,radiobutton,checkboxなど、その中の各種コントロールにアクセスすることがよくありますが、gridviewで各種コントロールにアクセスする方法についてまとめます.
まずgridviewでdropdownlistコントロールにアクセスする方法を見てみましょう.1つのgridviwで、表示される各レコードにユーザがドロップダウンで選択できるようにdropdownlistコントロールの内容を選択する必要があると仮定すると、gridviewのdropdownlistコントロールのオプションを選択した後、ボタンをクリックすると、ユーザがどのdropdownlistコントロールを選択したのかを印刷し、その値を出力するコードを使用することができる.
上記のコードは、まずデータベース内のtblphoneテーブルのデータをdatasetとして返します.次に、ページのitemtemplateで、次のように設計します.
ここでdropdownlistコントロールのdatasourceプロパティは、さっき戻ってきたdataset(populatedropdownlist()メソッドが呼び出された)をバインドし、datatextfieldプロパティとdatavaluefieldプロパティを設定することに注意してください.
次にbuttonのイベントに次のコードを書きます.
ここでは、各ローのdropdownlistコントロールの値を取得し、文字列の最後の出力に値を追加するためにループを使用します.
次にgridviewコントロールのcheckboxコントロールにアクセスする方法を見てみましょう.gridviewコントロールでは、ユーザーに複数の選択を与える機能が必要になります.この場合、checkboxコントロールを使用する必要があります.まず、checkboxの次のようなテンプレート列を作成します.
ユーザが選択したcheckboxの入手方法を概略的に説明するために、gridviewのオプションを選択した後、このボタンをクリックすると、ユーザが選択したオプションを出力し、ボタンのCLICKイベントに次のコードを書き込むことができる.
次に、ユーザがこのボックスを選択するとgridviewのcheckboxをすべて選択できる全選択の選択ボックスを追加する.まずheadtemplateでは次のように設計します.
<HeaderTemplate><input id="chkAll"onclick="javascript:SelectAllCheckboxes(this);"runat="server"type="checkbox"/></HeaderTemplate>
JAvascriptセクションのコードは次のとおりです.
<script language=javascript> function SelectAllCheckboxes(spanChk){ var oItem = spanChk.children; var theBox=(spanChk.type=="checkbox")?spanChk:spanChk.children.item[0]; xState=theBox.checked; elm=theBox.form.elements; for(i=0;i<elm.length;i++) if(elm[i].type=="checkbox"&& elm[i].id!=theBox.id) { if(elm[i].checked!=xState) elm[i].click(); }}</script>
三、gridviewでレコードを削除する処理
gridviewでは、記録を削除するときに、プロンプトボックスをポップアップしてヒントを与えることを望んでいます.asp.Net 1.1では、簡単に実現できますが、asp.Net 2.0ではどのように実現しますか?次に例を挙げて説明します.まず、HTMLページで次のコードを設計します.
<asp:GridView DataKeyNames="CategoryID"ID="GridView1"runat="server"AutoGenerateColumns="False"OnRowCommand="GridView1_RowCommand"OnRowDataBound="GridView1_RowDataBound"OnRowDeleted="GridView1_RowDeleted"OnRowDeleting="GridView1_RowDeleting"> <Columns><asp:BoundField DataField="CategoryID"HeaderText="CategoryID"/><asp:BoundField DataField="CategoryName"HeaderText="CategoryName"/><asp:TemplateField HeaderText="Select"><ItemTemplate><asp:LinkButton ID="LinkButton1"CommandArgument='<%# Eval("CategoryID") %>' CommandName="Delete"runat="server">Delete</asp:LinkButton></ItemTemplate></asp:TemplateField></Columns></asp:GridView>
上のコードでは、commandnameが「Delete」、commandargumentが削除するレコードのID番号を指定したリンクlinkbuttonを設定しています.commandnameがdeleteという名前に設定されるとgridviewのGridView_RowCommandとGridView_Row_Deletingイベントはいずれも受信者を刺激し、rowdataboundイベントを処理します.
protected void GridView1_RowDataBound(object sender,GridView RowEventArgs e){if(e.Row.RowType==DataControlRowType.DataRow){LinkButton l=(LinkButton)e.Row.FindControl("LinkButton 1");l.Attributes.Add('onclick","javascript:"return"+"confirm("このレコードを削除しますか?"+ DataBinder.Eval(e.Row.DataItem, "id") + "')"); }}
このコードでは、まずdatarowかどうかをチェックし、そうであればlinkbuttonごとにクライアントコード、基本、aspを追加する.Net 1.1のやり方はそれほど悪くない.
その後、ユーザーが削除の確認を選択した場合、削除ボタンをDeleteに設定するため、2つの方法があります.1つはrow_commandイベントには、次のコードが書き込まれます.
protected void GridView1_RowCommand(object sender,GridViewCommandEventArgs e){if(e.CommandName="Delete"){int id=Convert.ToInt 32(e.CommandArgument);//レコードを削除する専門プロセスDeleteRecordByID(id)}}
もう一つの方法はgridviewのrow_を使うことですdelettingイベントは、まずページHTMLコードにを追加してrow_を追加しますdeletingイベント:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e){ int categoryID = (int) GridView1.DataKeys[e.RowIndex].Value; DeleteRecordByID(categoryID); }
これはdatakeynamesを削除する番号に設定する必要があります.ここではcategoryidです.
一、Gridviewの内容をExcelにエクスポートする
日常の仕事の中でgridviewの中の内容をexcelレポートにエクスポートすることがよくあります.asp.Net 2.0では、gridview全体のコンテンツをexcelレポートにエクスポートすることも容易に実現できます.次に、その具体的な方法を説明します.
まず、基本的なページdefaultを作成します.aspx
1
<form id
=
"
form1
"
runat
=
"
server
"
>
2
<div>
3
<asp:GridView ID
=
"
GridView1
"
runat
=
"
server
"
>
4
<
/
asp:GridView>
5
<
/
div>
6
<br
/
>
7
<asp:Button ID
=
"
BtnExport
"
runat
=
"
server
"
OnClick
=
"
BtnExport_Click
"
8
Text
=
"
Export to Excel
"
/
>
9
<
/
form>
ここでaspx.csには、次のコードが書き込まれます.
1
protected
void
Page_Load(object sender, EventArgs e)
2
{
3
if
(
!
Page.IsPostBack)
4
{
5
BindData();
6
}
7
}
8
private
void
BindData()
9
{
10
string query
=
"
SELECT * FROM customers
"
;
11
SqlConnection myConnection
=
new
SqlConnection(ConnectionString);
12
SqlDataAdapter ad
=
new
SqlDataAdapter(query, myConnection);
13
DataSet ds
=
new
DataSet();
14
ad.Fill(ds,
"
customers
"
);
15
GridView1.DataSource
=
ds;
16
GridView1.DataBind();
17
}
18
19
public override
void
VerifyRenderingInServerForm(Control control)
20
{
21
//
Confirms that an HtmlForm control is rendered for
22
}
23
24
protected
void
Button1_Click(object sender, EventArgs e)
25
{
26
Response.Clear();
27
Response.AddHeader(
"
content-disposition
"
,
"
attachment;filename=FileName.xls
"
);
28
Response.Charset
=
"
gb2312
"
;
29
Response.ContentType
=
"
application/vnd.xls
"
;
30
System.IO.StringWriter stringWrite
=
new
System.IO.StringWriter();
31
System.Web.UI.HtmlTextWriter htmlWrite
=
new
HtmlTextWriter(stringWrite);
32
33
GridView1.AllowPaging
=
false
;
34
BindData();
35
GridView1.RenderControl(htmlWrite);
36
37
Response.Write(stringWrite.ToString());
38
Response.End();
39
GridView1.AllowPaging
=
true
;
40
BindData();
41
}
42
protected
void
paging(object sender,GridViewPageEventArgs e)
43
{
44
GridView1.PageIndex
=
e.NewPageIndex;
45
BindData();
46
}
47
48
上記のコードでは、まずgridviewを指定したデータソースにバインドし、button 1のボタン(EXCELにエクスポートするための)のイベントに関連するコードを書き込みます.ここではResponseを使用する.AddHeader("content-disposition","attachment;filename=exporttoexcel.xls");のfilenameでエクスポートするexcelのファイル名を指定します.ここでexporttoexcelです.xls.注意すべきは、gridviewの内容はページングで表示される可能性があるため、ここではexcelをエクスポートするたびにgridviewのallowpagingプロパティをfalseに設定し、ページフローで現在のページのgridviewをexcelにエクスポートし、最後にallowpagingプロパティを再設定します.また、実行時に指定するASPであることを確認するために、空のVerifyRenderingInServerFormメソッド(必ず書く)を書くことに注意してください.NETサーバコントロールはHtmlFormコントロールを表示します.
二、gridviewの各種コントロールにアクセスする
gridviewではdropdownlist,radiobutton,checkboxなど、その中の各種コントロールにアクセスすることがよくありますが、gridviewで各種コントロールにアクセスする方法についてまとめます.
まずgridviewでdropdownlistコントロールにアクセスする方法を見てみましょう.1つのgridviwで、表示される各レコードにユーザがドロップダウンで選択できるようにdropdownlistコントロールの内容を選択する必要があると仮定すると、gridviewのdropdownlistコントロールのオプションを選択した後、ボタンをクリックすると、ユーザがどのdropdownlistコントロールを選択したのかを印刷し、その値を出力するコードを使用することができる.
1
public DataSet PopulateDropDownList()
2
{
3
SqlConnection myConnection
=
new
SqlConnection(ConfigurationManager.ConnectionStrings[
"
MyDatabase
"
].ConnectionString);
4
SqlDataAdapter ad
=
new
SqlDataAdapter(
"
SELECT * FROM tblPhone
"
, myConnection);
5
DataSet ds
=
new
DataSet();
6
ad.Fill(ds,
"
tblPhone
"
);
7
return
ds;
8
}
9
10
上記のコードは、まずデータベース内のtblphoneテーブルのデータをdatasetとして返します.次に、ページのitemtemplateで、次のように設計します.
1
<ItemTemplate>
2
<asp:DropDownList ID
=
"
DropDownList1
"
runat
=
"
server
"
DataSource
=
"
<%# PopulateDropDownList() %>
"
3
DataTextField
=
"
Phone
"
DataValueField
=
"
PhoneID
"
>
4
<
/
asp:DropDownList>
5
<
/
ItemTemplate>
ここでdropdownlistコントロールのdatasourceプロパティは、さっき戻ってきたdataset(populatedropdownlist()メソッドが呼び出された)をバインドし、datatextfieldプロパティとdatavaluefieldプロパティを設定することに注意してください.
次にbuttonのイベントに次のコードを書きます.
1
protected
void
Button2_Click(
object
sender, EventArgs e)
2
{
3
StringBuilder str
=
new
StringBuilder();
4
foreach
(GridViewRow gvr
in
GridView1.Rows)
5
{
6
string
selectedText
=
((DropDownList)gvr.FindControl(
"
DropDownList1
"
)).SelectedItem.Text;
7
str.Append(selectedText);
8
}
9
Response.Write(str.ToString());
10
}
11
12
ここでは、各ローのdropdownlistコントロールの値を取得し、文字列の最後の出力に値を追加するためにループを使用します.
次にgridviewコントロールのcheckboxコントロールにアクセスする方法を見てみましょう.gridviewコントロールでは、ユーザーに複数の選択を与える機能が必要になります.この場合、checkboxコントロールを使用する必要があります.まず、checkboxの次のようなテンプレート列を作成します.
1
<asp:GridView ID
=
"
GridView1
"
runat
=
"
server
"
AllowPaging
=
"
True
"
AllowSorting
=
"
True
"
2
AutoGenerateColumns
=
"
False
"
DataKeyNames
=
"
PersonID
"
DataSourceID
=
"
mySource
"
Width
=
"
366px
"
CellPadding
=
"
4
"
ForeColor
=
"
#333333
"
GridLines
=
"
None
"
>
3
<Columns>
4
<asp:CommandField ShowSelectButton
=
"
True
"
/
>
5
<asp:BoundField DataField
=
"
PersonID
"
HeaderText
=
"
PersonID
"
InsertVisible
=
"
False
"
6
ReadOnly
=
"
True
"
SortExpression
=
"
PersonID
"
/
>
7
<asp:BoundField DataField
=
"
Name
"
HeaderText
=
"
Name
"
SortExpression
=
"
Name
"
/
>
8
<asp:TemplateField HeaderText
=
"
Select
"
>
9
<ItemTemplate>
10
<asp:CheckBox ID
=
"
chkSelect
"
runat
=
"
server
"
/
>
11
<
/
ItemTemplate>
12
<HeaderTemplate>
13
<
/
HeaderTemplate>
14
<
/
asp:TemplateField>
15
<
/
Columns>
16
<
/
asp:GridView>
ユーザが選択したcheckboxの入手方法を概略的に説明するために、gridviewのオプションを選択した後、このボタンをクリックすると、ユーザが選択したオプションを出力し、ボタンのCLICKイベントに次のコードを書き込むことができる.
1
for
(
int
i
=
0
; i < GridView1.Rows.Count; i
++
)
2
{
3
GridViewRow row
=
GridView1.Rows[i];
4
bool
isChecked
=
((CheckBox) row.FindControl(
"
chkSelect
"
)).Checked;
5
if
(isChecked)
6
{
7
str.Append(GridView1.Rows[i].Cells[
2
].Text);
8
}
9
}
10
Response.Write(str.ToString());
次に、ユーザがこのボックスを選択するとgridviewのcheckboxをすべて選択できる全選択の選択ボックスを追加する.まずheadtemplateでは次のように設計します.
<HeaderTemplate><input id="chkAll"onclick="javascript:SelectAllCheckboxes(this);"runat="server"type="checkbox"/></HeaderTemplate>
JAvascriptセクションのコードは次のとおりです.
<script language=javascript> function SelectAllCheckboxes(spanChk){ var oItem = spanChk.children; var theBox=(spanChk.type=="checkbox")?spanChk:spanChk.children.item[0]; xState=theBox.checked; elm=theBox.form.elements; for(i=0;i<elm.length;i++) if(elm[i].type=="checkbox"&& elm[i].id!=theBox.id) { if(elm[i].checked!=xState) elm[i].click(); }}</script>
三、gridviewでレコードを削除する処理
gridviewでは、記録を削除するときに、プロンプトボックスをポップアップしてヒントを与えることを望んでいます.asp.Net 1.1では、簡単に実現できますが、asp.Net 2.0ではどのように実現しますか?次に例を挙げて説明します.まず、HTMLページで次のコードを設計します.
<asp:GridView DataKeyNames="CategoryID"ID="GridView1"runat="server"AutoGenerateColumns="False"OnRowCommand="GridView1_RowCommand"OnRowDataBound="GridView1_RowDataBound"OnRowDeleted="GridView1_RowDeleted"OnRowDeleting="GridView1_RowDeleting"> <Columns><asp:BoundField DataField="CategoryID"HeaderText="CategoryID"/><asp:BoundField DataField="CategoryName"HeaderText="CategoryName"/><asp:TemplateField HeaderText="Select"><ItemTemplate><asp:LinkButton ID="LinkButton1"CommandArgument='<%# Eval("CategoryID") %>' CommandName="Delete"runat="server">Delete</asp:LinkButton></ItemTemplate></asp:TemplateField></Columns></asp:GridView>
上のコードでは、commandnameが「Delete」、commandargumentが削除するレコードのID番号を指定したリンクlinkbuttonを設定しています.commandnameがdeleteという名前に設定されるとgridviewのGridView_RowCommandとGridView_Row_Deletingイベントはいずれも受信者を刺激し、rowdataboundイベントを処理します.
protected void GridView1_RowDataBound(object sender,GridView RowEventArgs e){if(e.Row.RowType==DataControlRowType.DataRow){LinkButton l=(LinkButton)e.Row.FindControl("LinkButton 1");l.Attributes.Add('onclick","javascript:"return"+"confirm("このレコードを削除しますか?"+ DataBinder.Eval(e.Row.DataItem, "id") + "')"); }}
このコードでは、まずdatarowかどうかをチェックし、そうであればlinkbuttonごとにクライアントコード、基本、aspを追加する.Net 1.1のやり方はそれほど悪くない.
その後、ユーザーが削除の確認を選択した場合、削除ボタンをDeleteに設定するため、2つの方法があります.1つはrow_commandイベントには、次のコードが書き込まれます.
protected void GridView1_RowCommand(object sender,GridViewCommandEventArgs e){if(e.CommandName="Delete"){int id=Convert.ToInt 32(e.CommandArgument);//レコードを削除する専門プロセスDeleteRecordByID(id)}}
もう一つの方法はgridviewのrow_を使うことですdelettingイベントは、まずページHTMLコードに
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e){ int categoryID = (int) GridView1.DataKeys[e.RowIndex].Value; DeleteRecordByID(categoryID); }
これはdatakeynamesを削除する番号に設定する必要があります.ここではcategoryidです.