- PR -

GridViewのItemTemplate内にあるボタンでの処理について

投稿者投稿内容
あーこ
会議室デビュー日: 2008/12/02
投稿数: 18
投稿日時: 2009-03-23 12:46
ページ内にGridViewを配置しました。

そのGridViewのItemTemplateにボタンを配置して、

RowCommandでそのボタンが押されるとUpDateのストアドが実行される様にしています。

ここまでは希望する動作ができているのですが、
このストアドが実行された後に、GirdViewに表示されているデータをUpDateされた内容にしたいのですが、コードの記述がわかりません。


ただ、ボタンを押した後に「F5」を押すとUpDateされた内容にデータの内容が変わります。

申し訳ありませんが、ご助言よろしくお願いします。

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2009-03-23 13:03
データを更新したあとで、バインディングを実行、かな?
自動的に更新したデータをひろってくるわけじゃないので、そういった処理の記述が必要になります。
あーこ
会議室デビュー日: 2008/12/02
投稿数: 18
投稿日時: 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
秋刀魚
会議室デビュー日: 2008/11/10
投稿数: 16
投稿日時: 2009-03-23 14:10
GridView のRowCommand イベントはRowUpdated イベントとは違い、どのボタンが押下された場合でも発生します。
この後にRowUpdated などの個別イベントが発生しますので、データバインドは最初から想定されていません。
ですので、RowCommand イベントの場合は、データバインドを記述してやる必要があります。

・・・ってもう、解決されてましたね。失礼しました。

[ メッセージ編集済み 編集者: 秋刀魚 編集日時 2009-03-23 14:21 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2009-03-23 14:35
Responce.Endを呼び出しているからでしょうね。
http://msdn.microsoft.com/ja-jp/library/system.web.httpresponse.end.aspx

対処法としては、、、
CSVを出力させるのに別のリクエストをあげるべきだと思うけど、どうかな。。。
あーこ
会議室デビュー日: 2008/12/02
投稿数: 18
投稿日時: 2009-03-23 15:16
引用:

対処法としては、、、
CSVを出力させるのに別のリクエストをあげるべきだと思うけど、どうかな。。。



申し訳ございません。どの様に実装すればよいのでしょうか?

「別のリクエストをあげる」という部分がわからなくて・・・

ItemTemplate内にあるボタンのワンクリックで、

1.CSV出力をする。
2.UpDateのストアドを実行する。
3.画面をUpDateされた内容に変更する。

が可能でしょうか?
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-03-23 15:40
「画面表示を更新する処理」と「CSV ダウンロード処理」
を同時に行うのは厄介なので、
別の操作、
例えば既存のボタンとは別に「CSV ダウンロードボタン」を配置するとかで
対処すべきではないか、という事ではないでしょうか。

無理矢理やるなら画面表示を更新した後の画面の
body タグの onload で CSV ダウンロードのためのポストバックを
再度行うJavaScript を書くとか・・・。
あーこ
会議室デビュー日: 2008/12/02
投稿数: 18
投稿日時: 2009-03-23 16:15
引用:

例えば既存のボタンとは別に「CSV ダウンロードボタン」を配置するとかで
対処すべきではないか、という事ではないでしょうか。



ありがとうございます。

ただ、ひとつのボタンで処理をしたかったもので・・・

「CSV出力用のページを別に作成して(Loadイベントに出力する際のコードのみ記述)、

ItemTemplate内のボタンが押されたらCSV出力用のページに飛び、

出力後に再度戻って画面を更新する」

という内容を考え付いて、今試しましたがダメでした。
(画面がUpDate後の画面にならない。F5を押すと更新される。)

私がやろうとしている事は、作成する上で厄介なのでしょうか?

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