teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/03/27 05:31

投稿

退会済みユーザー
answer CHANGED
@@ -3,4 +3,86 @@
3
3
  GridViewとDetailsViewでデータ管理ページを作成する
4
4
  https://codezine.jp/article/detail/379
5
5
 
6
- 質問者さんのやりたいことと違う場合は、具体的にどこがどのように違うのか書いてください。
6
+ 質問者さんのやりたいことと違う場合は、具体的にどこがどのように違うのか書いてください。
7
+
8
+ ***************** 追記 *****************
9
+
10
+ 2017/03/27 14:06 のコメントに「Button を使った例を回答欄に追記しておきます。」と書きましたが、それを以下に追記します。
11
+
12
+ データソースコントロールに SqlDataSource を使用し、その ID を GridView の DataSourceID に設定して使うとします。
13
+
14
+ GridView では、ButtonField ではなく、Template に Button コントロールを配置してそれを使います(そちらの方が自分的には簡単なので)。
15
+
16
+ 以下のような SELECT クエリでフルバス+ファイル名.拡張子の文字列が FileName として取得できるとします。
17
+
18
+ SELECT DocumentID, Title, FileName FROM Production.[Document]
19
+
20
+ その条件で、以下のようなコードを書けば Button クリックでダウンロードされるはずです。
21
+
22
+ ```
23
+ <%@ Page Language="C#" %>
24
+
25
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
26
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
27
+
28
+ <script runat="server">
29
+
30
+ protected void Button1_Click(object sender, EventArgs e)
31
+ {
32
+ if (((Button)sender).CommandName == "download")
33
+ {
34
+ string filename = ((Button)sender).CommandArgument;
35
+
36
+ // filename にファイルのパスが取得できる。それを使って以下にファイルをダウンロード
37
+ // するためのコードを書く。
38
+
39
+ // 注意事項としては:
40
+
41
+ // キャッシュを許可するか否か、許可する場合は有効期限を指定しておく。
42
+
43
+ // Content-Disposition: attachment; filename= で指定するファイル名.拡張子、
44
+ // Content-Type: で指定する MIME Type は両方とも正確に設定すること。
45
+
46
+ // 日本語のファイル名は文字化けに注意。
47
+
48
+ // ファイルのダウンロードは TransmitFile メソッドを使うのがお勧め。
49
+
50
+ // .aspx ページのメソッドを使う場合は Response.End() を忘れずに。
51
+ }
52
+ }
53
+ </script>
54
+
55
+ <html xmlns="http://www.w3.org/1999/xhtml">
56
+ <head runat="server">
57
+ <title></title>
58
+ </head>
59
+ <body>
60
+ <form id="form1" runat="server">
61
+ <asp:SqlDataSource ID="SqlDataSource1" runat="server"
62
+ ConnectionString="<%$ ConnectionStrings:AdventureWorks %>"
63
+ SelectCommand="SELECT DocumentID, Title, FileName FROM Production.[Document]" >
64
+ </asp:SqlDataSource>
65
+ <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
66
+ DataKeyNames="DocumentID" DataSourceID="SqlDataSource1">
67
+ <Columns>
68
+ <asp:TemplateField>
69
+ <ItemTemplate>
70
+ <asp:Button ID="Button1" runat="server"
71
+ Text="Button" CommandName="download"
72
+ CommandArgument='<%# Eval("FileName") %>'
73
+ OnClick="Button1_Click" />
74
+ </ItemTemplate>
75
+ </asp:TemplateField>
76
+ <asp:BoundField DataField="DocumentID" HeaderText="DocumentID"
77
+ InsertVisible="False" ReadOnly="True" SortExpression="DocumentID" />
78
+ <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
79
+ </Columns>
80
+ </asp:GridView>
81
+ </form>
82
+ </body>
83
+ </html>
84
+ ```
85
+
86
+ もし、質問者さんの SQL Server データベースの [テーブル] では [保存先] (パス)と [ファイル名] (ファイル名.拡張子)というフィールドが別々になっている場合は以下のようにクエリを工夫してください。
87
+
88
+ SELECT ... ([保存先] + "\" + [ファイル名]) AS FileName FROM [テーブル]