第6回 Webサーバ・コントロール(前編)連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (2/4 ページ)

» 2002年09月12日 00時00分 公開
[田口景介]

 

■サーバ・コントロールのイベント

 Webサーバ・コントロールはそれぞれ固有のイベントを持ち、ユーザーの操作に応じて、イベント・ハンドラを呼び出す機能を備えている。各Webサーバ・コントロールが備えるイベントを表6.3に示す。表に示されているように、複数種のイベントを発生させるWebサーバ・コントロールもあれば、まったくイベントを発生しないコントロールもある。

コントロール イベント イベント・デリゲート
asp:Button Click EventHandler
asp:Button Command CommandEventHandler
asp:Calendar SelectionChanged EventHandler
asp:Calendar DayRender DayRenderEventHandler
asp:Calendar VisibleMonthChanged MonthChangedEventHandler
asp:CheckBox CheckedChanged EventHandler
asp:CheckBoxList SelectedIndexChanged EventHandler
asp:DropDownList SelectedIndexChanged EventHandler
asp:ImageButton Click EventHandler
asp:ImageButton Command CommandEventHandler
asp:LinkButton Click EventHandler
asp:LinkButton Command CommandEventHandler
asp:ListBox SelectedIndexChanged EventHandler
asp:RadioButton CheckedChanged EventHandler
asp:RadioButtonList SelectedIndexChanged EventHandler
asp:TextBox TextChanged EventHandler
asp:ImageButton Click ImageClickEventHandler
asp:AdRotator AdCreated AdCreatedEventHandler
asp:DataGrid CancelCommand DataGridCommandEventHandler
asp:DataGrid DeleteCommand DataGridCommandEventHandler
asp:DataGrid EditCommand DataGridCommandEventHandler
asp:DataGrid ItemCommand DataGridCommandEventHandler
asp:DataGrid UpdateCommand DataGridCommandEventHandler
asp:DataGrid ItemCreated DataGridItemEventHandler
asp:DataGrid ItemDataBound DataGridItemEventHandler
asp:DataGrid PageIndexChanged DataGridPageChangedEventHandler
asp:DataGrid SortCommand DataGridSortCommandEventHandler
asp:DataList CancelCommand DataListCommandEventHandler
asp:DataList DeleteCommand DataListCommandEventHandler
asp:DataList EditCommand DataListCommandEventHandler
asp:DataList ItemCommand DataListCommandEventHandler
asp:DataList UpdateCommand DataListCommandEventHandler
asp:DataList ItemCreated DataListItemEventHandler
asp:DataList ItemDataBound DataListItemEventHandler
asp:Repeater ItemCommand RepeaterCommandEventHandler
asp:Repeater ItemCreated RepeaterItemEventHandler
asp:Repeater ItemDataBound RepeaterItemEventHandler
asp:HyperLink なし
asp:Image なし
asp:Label なし
asp:Literal なし
asp:Panel なし
asp:PlaceHolder なし
表6.3 Webサーバ・コントロールのイベント一覧

 これらイベントの発生をサーバ・サイドで検出して処理するには、次の2つの記述を追加する。

  • Webサーバ・コントロールのタグにイベントとそれに対応するイベント・ハンドラを指定する
  • イベント・ハンドラとなるメソッドを定義する

 まず、タグに属性として、

On<イベント名>="<イベント・ハンドラ名>"

を追加して、処理すべきイベントと、そのイベントが発生したときに呼び出されるイベント・ハンドラ(メソッド)の名前を指定する。イベント・ハンドラ名には、メソッドに指定できる任意の名前を指定することができるが、

<コントロールID>_<イベント名>

と名付けるのが習慣となっているようだ。

<asp:Button id="submit" OnClick="Submit_Click" runat="server" />

Webサーバ・コントロールのタグにイベント・ハンドラを設定した例

 次に、イベント・ハンドラ名として指定した名前でメソッドを定義する。このイベント・ハンドラとなるメソッドのシグネチャはイベントの種類によってさまざまであり、その対応は表6.3のイベント・デリゲートに示したとおりである。ただし、大半のイベント・ハンドラは、次のシグネチャで示される標準的なイベント・デリゲート“EventHandler”として定義されている。これ以外のシグネチャで定義されるイベント・ハンドラも少なくないが、それらはごく一部のコントロールに集中していることが表6.3から見て取れるはずだ。

void <イベント・ハンドラ名>(object sender, EventArgs e) {
  ...
}

void Submit_Click(object sender, EventArgs e) {
  ...
}

イベント・ハンドラとなるメソッドの定義例

 イベントが発生すると、イベント・ハンドラに2つのパラメータが渡される。object型の第1引数には、イベントを発生したコントロール・オブジェクトが格納されている。例えば、asp:Buttonサーバ・コントロールがClickイベントを発生させたのであれば、第1引数にはこのボタン・コントロールに対応するButtonオブジェクトが渡される。

 イベント・ハンドラの第2引数はイベントに付随する情報を渡すために用意されているが、標準型シグネチャで定義されるEventArgs型では、特に有用な情報は格納されていない。このEventArgsクラスはイベント・データが格納される基本クラスであり、ほかのイベント・タイプでは、EventArgsクラスのサブクラスが第2引数として渡され、そのメンバにイベント固有の情報が格納される。例えば、asp:ImageButtonコントロールが発生するImageClickイベントのイベント・ハンドラは、次のシグネチャで定義されている。

void <イベント・ハンドラ名>(object sender, ImageClickEventArgs e) {
}

 第1引数は同じくobject型だが、第2引数はImageClickEventArgsオブジェクトとなっている。このImageClickEventArgsクラスはint型のフィールドXとYを持ち、イベント発生時にクリックした座標が格納されている。イベント・ハンドラでこの値を参照すれば、イメージ・ボタンをクリッカブル・マップのように機能させることができる。

 このほかにも、イベント固有のパラメータを渡すイベントがあるが、それはボタン系コントロール(asp:Button、asp:ImageButton、asp:LinkButton)が発生するCommandイベントと、いま述べたasp:ImageButtonコントロールが発生するImageClickイベント、それに多機能なリッチ・コントロール(asp:AdRotator、asp:Calendar、asp:DataGrid、asp:DataList、asp:Repeater)が発生するさまざまなイベントに限られ、それ以外のコントロールが発生する大半のイベントでは、特別なパラメータを格納しないEventArgsオブジェクトが渡される。

 ImageClickイベントの例に示したとおり、イベント固有のパラメータはEventArgsクラスのサブクラスとして渡されるが、このサブクラスの名前は、イベント・デリゲート名の末尾から“Handler”を取り除き、代わりに“Args”をつなげた名称となる。つまり、デリゲート名が“<イベント名>Handler”ならば、そのパラメータは“<イベント名>Args”クラスのオブジェクトとして渡される。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。