2004.10.28

DataGrid内のボタンコントロールのクリックイベントについて

DataGrid内にボタンを配置するとクリック時にonitemcommand
で指定したイベントが走ります。この時点でイベントを起こした
のはDataGridであり、DataGrid内のどのボタンが起こしたのかま
でわかりません。なので、ボタンが1つなら問題ありませんが、2つや
3つとなると判断することができません。
そこで私は、DataGirdのItemDataBoundイベントで以下のJavaScriptを
記述し、押されたボタンコントロール名を隠しコントロールに格納しています。

 Dim btnButton As Button = CType(e.Item.FindControl("btnButton"), Button)

 btnButton.Attributes("onClick") &= Me.txtHCtl.ID & ".value = '" & btnButton.ClientID & "';"

※ me.txtHCtl : 隠しコントロール

これによって、onitemcommandイベント時にコントロール名を取得し、
ボタンコントロール名と比較することでどのボタンが押されたか判断することが出来ます。

私の方法では、以下のように記述しボタンコントロール名を取得しています。

 Dim lsButtonID As String = CType(e.Item.FindControl("btnButton"), Button).ClientID

ちなみに、DataGrid内にボタンコントロールを含むユーザーコントロールを配置
した場合でも、ボタンを押した場合onitemcommandイベントが発生するので注意が必要です。

トラックバック

このエントリーのトラックバックURL:
http://www.ilovex.co.jp/scripts/intra/mt/mt-tb.cgi/212

コメント (2)

市川:

Buttonに関してはJavaScriptを書かなくても標準的なイベント(***_ItemCommand)だけで取れると思います。

 private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) {
  if ( e.CommandSource is System.Web.UI.WebControls.Button ) {
   int iItemIndex= e.Item.ItemIndex;
   string sCommandName= ((System.Web.UI.WebControls.Button)(e.CommandSource)).CommandName;
  }
 }
(なぜか C#)

naka:

ItemCommandでCommandNameを取るには、
単に e.CommandName でも取れますけど、
やはりきちんとキャストすべきですか?

コメントを投稿

photo
saito