- - PR -
GridViewのItemTemplate内にあるボタンでの処理について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-03-23 12:46
ページ内にGridViewを配置しました。
そのGridViewのItemTemplateにボタンを配置して、 RowCommandでそのボタンが押されるとUpDateのストアドが実行される様にしています。 ここまでは希望する動作ができているのですが、 このストアドが実行された後に、GirdViewに表示されているデータをUpDateされた内容にしたいのですが、コードの記述がわかりません。 ただ、ボタンを押した後に「F5」を押すとUpDateされた内容にデータの内容が変わります。 申し訳ありませんが、ご助言よろしくお願いします。 | ||||
|
投稿日時: 2009-03-23 13:03
データを更新したあとで、バインディングを実行、かな?
自動的に更新したデータをひろってくるわけじゃないので、そういった処理の記述が必要になります。 | ||||
|
投稿日時: 2009-03-23 13:58
どっとねっとふぁん様、いつもHPを参考にさせて頂いています。
「GridView1.DataBind()」を一番最後に追加しましたら処理されました。 第二段階としてUpDateされるストアドの前に、 データをCSV出力させると「GridView1.DataBind()」が無視されます。 下記にコードを記載しますので、どこがおかしいかご指摘頂けると嬉しいです。 この場合も「F5」を押すとUpDateされた内容にデータが変わります。 VBコード If e.CommandName = "k" Then Dim index As Integer = Convert.ToInt32(e.CommandArgument) Dim hinban1 As Label = GridView1.Rows(index).Cells(3).FindControl("lbl_hinban1") Dim hinban2 As Label = GridView1.Rows(index).Cells(3).FindControl("lbl_hinban2") Dim chk_k As CheckBox = GridView1.Rows(index).Cells(7).FindControl("chk_k") Dim lbl_k_time As Label = GridView1.Rows(index).Cells(.FindControl("lbl_k_time") Dim cn As New SqlConnection("Data Source=接続するIP;Initial Catalog=HOGE;Integrated Security=SSPI;") cn.Open() Response.AddHeader("Content-Disposition", "attachment;filename=" & hinban1.Text + hinban2.Text & ".csv") Response.ContentType = "application/octet-stream" Dim encoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift-JIS") Dim cmd As New SqlCommand("q_main_data", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@id", SqlDbType.Int) Dim id As Label = GridView1.Rows(index).Cells(0).FindControl("lbl_ID") cmd.Parameters("@id").Value = id.Text Dim datareader As SqlDataReader = cmd.ExecuteReader() While datareader.Read() Dim tmpString As String = "" Dim count As Integer For count = 0 To datareader.FieldCount - 1 tmpString += datareader(count).ToString() + "," Next count If tmpString <> "" Then tmpString = tmpString.Substring(0, tmpString.Length - 1) End If tmpString += ControlChars.Cr + ControlChars.Lf Response.BinaryWrite(encoding.GetBytes(tmpString)) End While datareader.Close() cn.Close() If chk_k.Checked = False Then Dim cn2 As New SqlConnection("Data Source=接続するIP;Initial Catalog=HOGE;Integrated Security=SSPI;") Dim cmd2 As New SqlCommand("q_download", cn2) cmd2.CommandType = CommandType.StoredProcedure cmd2.Parameters.Add("@id", SqlDbType.Int) Dim id2 As Label = GridView1.Rows(index).Cells(0).FindControl("lbl_ID") cmd2.Parameters("@id").Value = id2.Text cn2.Open() cmd2.ExecuteNonQuery() cn2.Close() End If Response.End() cn.Close() GridView1.DataBind() End If | ||||
|
投稿日時: 2009-03-23 14:10
GridView のRowCommand イベントはRowUpdated イベントとは違い、どのボタンが押下された場合でも発生します。
この後にRowUpdated などの個別イベントが発生しますので、データバインドは最初から想定されていません。 ですので、RowCommand イベントの場合は、データバインドを記述してやる必要があります。 ・・・ってもう、解決されてましたね。失礼しました。 [ メッセージ編集済み 編集者: 秋刀魚 編集日時 2009-03-23 14:21 ] | ||||
|
投稿日時: 2009-03-23 14:35
Responce.Endを呼び出しているからでしょうね。
http://msdn.microsoft.com/ja-jp/library/system.web.httpresponse.end.aspx 対処法としては、、、 CSVを出力させるのに別のリクエストをあげるべきだと思うけど、どうかな。。。 | ||||
|
投稿日時: 2009-03-23 15:16
申し訳ございません。どの様に実装すればよいのでしょうか? 「別のリクエストをあげる」という部分がわからなくて・・・ ItemTemplate内にあるボタンのワンクリックで、 1.CSV出力をする。 2.UpDateのストアドを実行する。 3.画面をUpDateされた内容に変更する。 が可能でしょうか? | ||||
|
投稿日時: 2009-03-23 15:40
「画面表示を更新する処理」と「CSV ダウンロード処理」
を同時に行うのは厄介なので、 別の操作、 例えば既存のボタンとは別に「CSV ダウンロードボタン」を配置するとかで 対処すべきではないか、という事ではないでしょうか。 無理矢理やるなら画面表示を更新した後の画面の body タグの onload で CSV ダウンロードのためのポストバックを 再度行うJavaScript を書くとか・・・。 | ||||
|
投稿日時: 2009-03-23 16:15
ありがとうございます。 ただ、ひとつのボタンで処理をしたかったもので・・・ 「CSV出力用のページを別に作成して(Loadイベントに出力する際のコードのみ記述)、 ItemTemplate内のボタンが押されたらCSV出力用のページに飛び、 出力後に再度戻って画面を更新する」 という内容を考え付いて、今試しましたがダメでした。 (画面がUpDate後の画面にならない。F5を押すと更新される。) 私がやろうとしている事は、作成する上で厄介なのでしょうか? |