none
CSVファイル出力後、パネルを閉じたい。 RRS feed

  • 質問

  • ばいきるとと申します。

     

    CSVファイルを出力した後、パネルを閉じたいのですが、うまくいきません。

    CSV出力は一般的な方法でやっていますが、その後のメソッドが走りません。

    処理の仕方に根本的な問題があるかもしれませんので、ご存知でしたらご教授願います。

    処理としては、Button1クリック ⇒ CSVファイルの出力 ⇒ Panel1を閉じる

    以下、ソースコードを記述します。

     

    Protected Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click

     

    Response.Clear()
    Response.ClearContent()
    Response.ClearHeaders()
    Response.AddHeader("Content-Disposition", "attachment;filename=Data.csv")
    Response.ContentType = "application/octet-stream"
    Dim encoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift-JIS")

    Dim s As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("ConnectionString")
    Dim conn = New System.Data.SqlClient.SqlConnection(s.ConnectionString)
    conn.Open()
    Dim sql As String = "select * from employee;"
    Dim cmd As New SqlCommand(sql, conn) '

    Dim reader As SqlDataReader = cmd.ExecuteReader()

    While reader.Read()
       Dim s As String = ""
       Dim i As Integer
       For i = 0 To reader.FieldCount - 1
          s += reader(i).ToString() + ","
       Next i
       If s <> "" Then

          s = s.Substring(0, s.Length - 1)
       End If
       s += ControlChars.Cr + ControlChars.Lf
       Response.BinaryWrite(encoding.GetBytes(s))
    End While
    Response.Flush()

     

    'Panel1.visible = False 'ここに入れるとエラー。

    Response.End()

     

    Panel1.visible = False 'ここで、パネルを閉じたいが、反応しない。

     

    End Sub

    2008年9月1日 10:31

回答

  • CSV ファイルをダウンロードするだけの専用のページ(例: Download.aspx)を作っ
    て、メインページのボタンクリックで RegisterStartupScript メソッドを使って、
    ジャワスクリプトで新しいウィンドウにそれをオープンしてやるという方法で、う
    まくいくと思います。(もっとスマートな方法はあるかもしれませんけど)

     

    メインページは以下のような感じです。

    Code Snippet

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        protected void Button1_Click(object sender, EventArgs e)
        {
            Panel1.Visible = false;

            string script = "window.open('Download.aspx', '_blank');";
            string key = "OpenNewWindow";
            Type cstype = this.GetType();
            if (ClientScript.IsStartupScriptRegistered(cstype, key) != true)
            {
                ClientScript.RegisterStartupScript(cstype, key, script, true);
            }
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>DB のデータを CSV ファイルにしてダウンロード</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />   
            <asp:Panel ID="Panel1" runat="server">
            <h1>ボタンクリックで隠す</h1>
            </asp:Panel>   
        </div>
        </form>
    </body>
    </html>

     

     

    Download.aspx の方は、Page_Load に質問に記載されていたような CSV をダウ
    ンロードするコードを入れるようにしてください。

    2008年9月1日 14:41

すべての返信

  • CSV ファイルをダウンロードするだけの専用のページ(例: Download.aspx)を作っ
    て、メインページのボタンクリックで RegisterStartupScript メソッドを使って、
    ジャワスクリプトで新しいウィンドウにそれをオープンしてやるという方法で、う
    まくいくと思います。(もっとスマートな方法はあるかもしれませんけど)

     

    メインページは以下のような感じです。

    Code Snippet

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        protected void Button1_Click(object sender, EventArgs e)
        {
            Panel1.Visible = false;

            string script = "window.open('Download.aspx', '_blank');";
            string key = "OpenNewWindow";
            Type cstype = this.GetType();
            if (ClientScript.IsStartupScriptRegistered(cstype, key) != true)
            {
                ClientScript.RegisterStartupScript(cstype, key, script, true);
            }
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>DB のデータを CSV ファイルにしてダウンロード</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />   
            <asp:Panel ID="Panel1" runat="server">
            <h1>ボタンクリックで隠す</h1>
            </asp:Panel>   
        </div>
        </form>
    </body>
    </html>

     

     

    Download.aspx の方は、Page_Load に質問に記載されていたような CSV をダウ
    ンロードするコードを入れるようにしてください。

    2008年9月1日 14:41
  • SurferOnWww  さま

     

    ありがとうございます。別画面を立ち上げることで、パネルを閉じさせることができました。

    ところで、この件はやはり、同一画面では難しいのでしょうか。

     

    Response.End()

    あたりが、なにやら悪さをしているような気がするのですが。

     

    2008年9月2日 6:46
  • > ところで、この件はやはり、同一画面では難しいのでしょうか。

     

    難しいというより、無理だと思います。

     

    最初の質問のコードで、ボタンがクリックされてポストバックがかかり、サーバー
    から送られてくるのは DB から取得したデータを CSV 形式に加工したバイト列だ
    けです。

     

    ボタンクリック後もポスト前の画面が表示されているのは、ブラウザにポスト前の
    画面が保持されているからだと思います(ここのところ確証はないのですが)。少
    なくとも、ポストバック後サーバーから送られてきたものが表示されているわけで
    はないことは確かです。

    2008年9月2日 13:47
  • 先のレスで「もっとスマートな方法はあるかもしれませんけど」と書きました
    が、Button コントロールの OnClientClick プロパティに window.open を設定
    する方が簡単かつスマートなようです。

     

    具体的には、先にアップしたサンプルコードで、以下のように OnClientClick
    プロパティを設定し、

     

    Code Snippet

    <asp:Button ID="Button1" runat="server"
        Text="Button"
        onclick="Button1_Click"
        OnClientClick="window.open('Download.aspx', '_blank');" />

     

     

    Button1_Click ハンドラの中で、Panel1.Visible = false; だけを残して他を
    削除することになります。

     

    そうすれば、先のコードでは Opera, Safari では追加されたスクリプトが無
    視されて CSV ファイルはダウンロード不可だったところが、IE や Firefox
    と同じようにはできないまでも、一応ダウンロードはできるようになると思
    います。

    2008年9月21日 1:01