@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

CSV出力後もまたCSV出力してしまう

1
投稿者投稿内容
sent
会議室デビュー日: 2007/07/02
投稿数: 8
投稿日時: 2007-08-02 16:50
いつもお世話になっております。
VisualStudio2005、AjaxControlToolKitでASP.NET(VB)の開発をしております。(WindowsXP)

DataGridから行を選択して、ボタンを押すとCSVがダイアログつきで出力されます。
その後、再度行を選択すると、またCSVがダイアログつきで出力されてしまうので困っています。
ただし、他のボタンを押すと、正常な処理です。

以下にソースを載せますので、どなたかCSVを出力するボタンを押した時だけ出力されるやり方をご教授ください。

DataGridから行を選択できるようにするために、
-----sample1.aspx.vb-----
Private Sub dgrDatail_list_ItemDataBound(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgrDatail.ItemDataBound

If e.Item.ItemType = ListItemType.AlternatingItem _
OrElse e.Item.ItemType = ListItemType.Item Then
      '↓ここでJavaScriptを呼ぶようにしてあります。
e.Item.Attributes("onclick") = "SelectRow('" & e.Item.ItemIndex & "')"
e.Item.Style("cursor") = "pointer"

End If

End Sub
ボタンをつけなかったのは、横スクロールが必要なほど幅が広く、行のどの列を選択しても良いようにするためです。

-----sample1.aspx----
<script type="text/javascript>
//DataGrid行選択時
function SelectRow(value){
//選択済みの色に変える
form1.hidIdx.value = value;
form1.submit();
}
[後略]

↑の SelectRow でリロードがかかった時にはPage_LoadでhidIdxを引数にして色付けを行い、選択された行を記憶する処理があります。(メソッド名:Grid_SelectRow(…))

----sample1.aspx.vb-----
'CSVダウンロードボタン押下時
Protected Sub lnkbtnCsvDL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lnkbtnCsvDL.Click

Dim strCSV_DATA() As String
Dim byt As Byte()
Dim result As Boolean = False

Try
'CSVファイル名とCSVデータを取得
strCSV_DATA = returnCSVdata()

byt = System.Text.Encoding.Unicode.GetBytes(strCSV_DATA(1))
byt = System.Text.Encoding.Convert(System.Text.Encoding.Unicode, System.Text.Encoding.GetEncoding("shift-jis"), byt)
Response.Clear()
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Length", byt.Length)
Response.AddHeader("Content-Disposition", "attachment;filename=" & strCSV_DATA(0) & "")
Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis")
Response.CacheControl = "Private"

Response.Write(strCSV_DATA(1))

Response.Flush()
Response.End()

Catch trreadEx As System.Threading.ThreadAbortException

Catch ex As Exception
AlertMsg.Add(getExceptionMessage(ex))
End Try
End Sub

一度CSV出力のボタンを押して、CSVが出力された後にDataGridから行を選択すると
Page_Loadから、選択行の色づけ等を行うGrid_SelectRow(…)のあとにlnkbtnCsvDL_Click(…)にいってしまうのです。
Responseをどうにかしなきゃいけない(開放のようなこと?)のか、見当もつきません。
再度行選択をする前に手動で(F5で)画面を更新すると大丈夫でした。
どうしてこの画面だけが・・・と頭を悩ませています。
JavaScriptでやっている部分がいけないのかなぁとも思いますが、どうしたらいいでしょうか。
どうぞよろしくお願いいたします。
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-08-02 18:46
通常の処理をしているページ内で
Response.〜 ・・・

っていう記述はしていいのかな…?


1.sample2.aspx というCSVダウンロード用のページを作る。
2.そこにCSVダウンロードボタン押下時の処理を記述。
3.CSVダウンロードボタンはsample2.aspxへのリンクボタンとする。

sent
会議室デビュー日: 2007/07/02
投稿数: 8
投稿日時: 2007-08-02 19:34
よっし〜。さん、お返事ありがとうございます。

以前開発したプロジェクト(ASP.NET by VS2003)では、ひとつの画面でDataGridに表示した一覧をCSV出力、とやっていました。
今回と違うのは、行を選択するかしないかです。

よっし〜。さんの仰るとおりにサンプルを作ってみました。
CSVボタンの処理はsample2.aspxに飛ばすだけ。
sample2.aspxにてCSV出力(Response.End() のあとにResponse.Redirect(…)で戻ってくる)

しかし、行を選択しているだけなのに、CSV出力ボタンのイベントに行ってしまうのは変わりませんでした。


選択時のform1.submit();で、CSVのクリックイベントの続きをやっているような感じです。
やはり行選択の処理を回りくどくしているからなんでしょうか・・・。


たとえばDataGridに1〜5まで表示されているとして、
1を選んでCSV出力ボタンを押す。
ダイアログで保存する。(キャンセルでも一緒)
3を選ぶ。
そうすると、またダイアログが出るので開いて見てみたところ
1と3のデータが出力されていました。
その後で5を選ぶと、またダイアログが出て、開くと
1と5のデータが出力されていました。

画面では1だけが選択されている状態です。

引き続きよろしくお願いいたします。
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-08-02 20:17
引用:

sentさんの書き込み (2007-08-02 16:50) より:

JavaScriptでやっている部分がいけないのかなぁとも思いますが、どうしたらいいでしょうか。



Gridview の行選択に JavaScriptが必要な理由がイマイチよくわかりません。
プロパティ設定だけで行選択した格好になりませんでしたか?
選択行を保持したいのであればItemDataBoundで何かしらにセットすればよいと思いますが。
sent
会議室デビュー日: 2007/07/02
投稿数: 8
投稿日時: 2007-08-02 20:56
よっし〜。さん、ありがとうございます。

ボタンを使わずにDataGridを押したイベントが取れないか、というように考えを変えて再度検索したところ、以下のスレとHPがヒットしました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=23471&forum=7&3
http://www.friendlysw.com/aspnet/Articles/app/030529-8.aspx

これをまねることで、無事に思い通りの動きにすることができました。
検索力が足りなかったようです。すみません。
ありがとうございました。
1

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