- PR -

DataGridのSelectedIndexchangedとItemComandを順番に実行したい

1
投稿者投稿内容
かばりん
会議室デビュー日: 2003/12/21
投稿数: 6
投稿日時: 2004-01-05 16:24
DataGridで"詳細ボタン"を押した場合に、次ページでDataGridの選択行の詳細データを作成すプログラムを組んでいます。

このときに、数十回に一回の割合で、一つ前に表示した行の情報が表示されてしまいこまっていおります。

private void dataGrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{

  if(e.CommandName == "detail")
  {
    詳細画面ページへ移動
  }
}

private void dataGrid_SelectedIndexChanged(object sender, System.EventArgs e)
{
 選択行のデータを取得
}

この二つがメインの部分なのですが

ステップ実行をした場合は
1 ItemCommandが実行される
    CommandnameがDetailではないので、ページ移動はしない
2 dataGrid_SelectedIndexChangedが実行される
    詳細情報が得られる
3 ItemCommandが実行される
    CommandnameがDetailなので、ページ移動を行う
という順序で動作します。
しかしながら、稀に、dataGrid_SelectedIndexChangedが実行される前に、ページ移動をしてしまうため、前の詳細データを引きずってしまうのです。

ステップ実行では確実に一行舞ごとに実行されるのでわからなかったのですが、どうも同時に(非同期)に各イベントが走っており、稀に、dataGrid_SelectedIndexChangedの前にページ移動が行われて今います。

対策として、確実に順番に実行できるようにしたいのですがどのような方法があるのか教えていただければと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-05 22:43
 ご説明では、実行される順序とイベントトリガーの関係がよくわからないのですが…

 DataGridの「詳細ボタン」で、何を行っているのでしょう?ボタンなのでItemCommandイベントが起動されるのはわかるのですが、その後のSelectedIndexChangedは、Selectコマンドで変わるのではないでしょうか?その後にまたItemcommandが呼ばれるのはなぜ?イベントが2重起動しているのでしょうか?

 私のイメージとしては、「選択ボタンと詳細ボタンがあって、選択して詳細表示」なのですが・・・それとも詳細ボタンが選択ボタンを兼ねているのでしょうか?

 「数十回に一度」、複数の端末からのリクエストが重なっている、、、なんてことはないですか?
かばりん
会議室デビュー日: 2003/12/21
投稿数: 6
投稿日時: 2004-01-06 14:46
すみません。持っと詳しく書きたいと思います。
先ず、
>「選択ボタンと詳細ボタンがあって、選択して詳細表示」なのですが・・・それとも
>詳細ボタンが選択ボタンを兼ねているのでしょうか?

ですが、詳細ボタンが選択ボタンを兼ねているという方です。
詳細ボタンを押して、Gridの行番号を取得し、行番号から選択行の詳細データを取得する形です。
流れとしては、
1.DataGrid_Indexchangeイベントが起こり、行データを取得する
2.DataGrid_ItemCommandで詳細ボタンを押したかを判別して
  (書斎ボタンのCommandnameをdetailと設定してあります)次ページで跳ぶ
が起こって欲しい流れです。
Debugモードでステップ実行した場合は
1.DataGrid_ItemCommandイベントが発生。Command_nameがSelectのためページ移動しない
2.DataGrid_Indexchangeで行番号を取得し、データを取得
3.DataGrid_ItemCommandイベントが発生。Command_nameがdetailのためページ移動する
となりますし、ほとんどはこの順序で起こります。
しかし偶に、
3.DataGrid_ItemCommandイベントが発生。Command_nameがdetailのためページ移動する
が先に起こるようで、この場合はページ移動しても、その行のIndexやデータを取得しないために、前の行データを表示することとなってしまいます。

なので、DataGrid_Indexchangeが起こらない?起こる前にDataGrid_ItemCommandでCommand_nameがdetailのときに、再度Indexを取得して、確実にデータを取得する必要があります。

方法としては、Command_nameがdetailのときにIndexを取っていない場合は、再度DataGrid_Indexchangeイベントが起こすことが出来ればよいのですが、任意にイベントを起こすことは出来るんでしょうか?また、イベントをネストすることとか出来るんでしょうか。

お客様からは、選択、詳細という2ステップではなく1ステップで出来るようにとの依頼を受けております。
そのため、1ステップで出来るようにしたのですが、数十回に一回の割合でおかしくなるので困っています。
出来ない場合は、どう説明するかも考えなくてはいけません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-06 15:54
 やっぱりわかりません。

 試しにDataGridを置いたaspxを作ってみました。このDataGridのプロパティビルダーから「選択」ボタンを置きました(CommandNameは"Select")。そして、DataGrid.ItemCommandとDataGrid.SelectIndexChangedイベントハンドラを定義し、ブレークポイントを置いたところ…ItemCommandの方が先に発生します。

 次に先の「選択」ボタンの「CommandName」を「Detail」に変更したところ、ItemCommandのみが処理されます。(選択はされません)

CommandName = "Select"のとき:
 ItemCommandイベントが発生
 SelectedIndexChangedイベントが発生
#この順序は、「コマンド解析:"Select"→選択変更」という順序であると考える

CommandName = "Detail"のとき:
 ItemComandイベントが発生



 なぜItemCommand→SelectedIndexChanged→ItemCommandという流れができるのか、よくわかりません。

####
 選択と同時に詳細表示と決まっているなら、SelectedIndexChangedイベントハンドラで詳細表示もしてしまえばよいのでは?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-01-06 16:23
いっそのこと、
ItemCommandイベント内で
引数の
System.Web.UI.WebControls.DataGridCommandEventArgs e
からデータを取得するってのは、どうですか?
1

スキルアップ/キャリアアップ(JOB@IT)