質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

12027閲覧

ASP.NETにおいて、Table内のセルまたは文字がクリックされた時にイベントを起こす方法を教えてほしい

ehyai

総合スコア43

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2016/12/03 17:31

編集2016/12/07 16:44

###前提・実現したいこと
ASP.NETでTableを利用して動的に表を作成し、その表の中のセル内、もしくはセル内の文字がクリックされたらイベントを起こす方法を教えていただきたいのです。
具体的には、ある特定のディレクトリを取得し、そのディレクトリ内のファイルの数だけセルを作り、そのセル、またはセル内の文字がクリックされたら、そのファイルへのパスを利用して、ファイル内の中身の文章をブラウザで表示できるような仕組みを考えています。もしそういったことが不可能であって、Table以外の方法を用いて似たようなことが可能なものがありましたら、教えていただけるとありがたいです。お手数ですが、よろしくお願いします。

###該当のソースコード
Tableを利用して、表を以下のように作りました。

//ディレクトリ内の問題フォルダの数だけ表の列を増やす IEnumerable<string> subFolders = System.IO.Directory.EnumerateDirectories(@「特定のディレクトリ」, "*", System.IO.SearchOption.AllDirectories).Select(Path.GetFileName); // ファイルパスからファイル名を抽出 TableRow tableRow; TableCell tableCell; foreach (string f in subFolders) //ここで行を作っていく { tableRow = new TableRow(); tableCell = new TableCell(); tableCell.Text = f; tableRow.Cells.Add(tableCell); IEnumerable<string> Qfiles = System.IO.Directory.EnumerateFiles(@「特定のディレクトリ」 + "\\" + f, "*", System.IO.SearchOption.AllDirectories).Select(Path.GetFileName); foreach (string f2 in Qfiles) { tableCell = new TableCell(); tableCell.Text = f2; tableRow.Cells.Add(tableCell); } Table1.Rows.Add(tableRow); }

foreach(string f2 in Qfiles)文の中にクリックイベントを入れたいと考えているのですが、どのように書けばよいか調べても出てこなかったので、教えていただけたらと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ある特定のディレクトリを取得し、そのディレクトリ内のファイルの数だけセルを作り、そのセル、またはセル内の文字がクリックされたら、そのファイルへのパスを利用して、ファイル内の中身の文章をブラウザで表示できるような仕組みを考えています。

テーブルは完成していて、ディレクトリ名 / ファイル名等は期待通り表示されているという理解でいいのですよね?

で、質問者さんが知りたいのは「セル内、もしくはセル内の文字がクリック」されたときに何らかのイベントが発生し、「ファイル内の中身の文章をブラウザで表示」するためのトリガとなる「イベント」を発生させる方法ということでいいのですよね?

上記の理解で良いのであれば、以下のような方法が考えられます。

(1) HyperLink コントロールを使う

foreach(string f2 in Qfiles) の中に HyperLink コントロールを初期化して追加するコードを書く。

ファイルが何だか分かりませんが、ホルダが IIS の仮想ディレクトリ / アプリケーションに設定されていて、ブラウザからそのファイルの URL を直接要求して開けるものであれば、HyperLink.NavigateUrl プロパティにその URL を設定する。

ブラウザから直接開けなければ、表示するための専用のページを作成し、そのページを HyperLink.NavigateUrl プロパティに設定する。ファイル情報はクエリ文字列で渡す。

(2) クリックするとポストバックが発生するコントロール(Button など)を使う

foreach(string f2 in Qfiles) の中にそのコントロールを初期化して追加するコードを書く。その CommandName, CommandArgument プロパティにファイル情報を設定する。

ファイルを表示するための専用のページまたはダウンロードするための HTTP ハンドラを作成する。

サーバー側で発生するクリックイベントで CommandName, CommandArgument プロパティからファイル情報を取得し、専用のページまたはダウンロードするための HTTP ハンドラにクエリ文字列として渡し、リダイレクトする。

上記が NG であれば、具体的にどうしたいのか連絡ください。

投稿2016/12/04 01:32

編集2016/12/04 01:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ehyai

2016/12/04 10:08 編集

回答してくださってありがとうございます。SurferOnWwwさんの解答を参考にして、(1) HyperLink コントロールを初期化して追加することで、Tableの文字にリンクを貼るコードを書こうとしました。その際、「http://dobon.net/vb/dotnet/file/uritofilepath.html」のサイトを参考にして、ファイルパスをURLに変換して、そのURLをNavigateUrlに設定するコードをforeach(string f2 in Qfiles)内に書きました。 foreach (string f2 in Qfiles) { tableCell = new TableCell(); tableCell.Text = f2; //tableRow.Cells.Add(tableCell); HyperLink hl = new HyperLink(); hl.Text = tableCell.Text; string winPath = @「特定のディレクトリ」+ "\\" + f + "\\" + f2; Uri u = new Uri(winPath); if (u.IsFile) { //Windows形式のパス表現に変換する string uriPath = u.AbsoluteUri; hl.NavigateUrl = uriPath; } tableRow.Cells.Add(tableCell); } しかし、実行して試してみても、Table内の文字はリンクになりませんでした。どのあたりが間違っているのか、どう直したらよいかを、SurferOnWwwさんさえよろしければ教えていただけないでしょうか。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/12/05 02:24

上の回答に書いた「ホルダが IIS の仮想ディレクトリ / アプリケーションに設定されていて」というのが前提だったのですが違うのでしょうか? 仮想ディレクトリ / アプリケーションに設定されていれば NavigateUrl プロパティに設定するのは、 http://<ホスト名>/<アプリケーション名>/<フォルダ名>/<ファイル名> というような絶対 URL か、 /<アプリケーション名>/<フォルダ名>/<ファイル名> というような相対 URL になるはずなのですが・・・
退会済みユーザー

退会済みユーザー

2016/12/05 02:48

参考にされている DOBON.NET の記事は "「c:\temp\doc.txt」を「file:///c:/temp/doc.txt」に変換" ということのようですが、file:/// はローカル PC のフォルダ / ファイルへのパスを指定するもので、それを NavigateUrl プロパティに設定するというのは Web アプリでは全く何の意味がないのは分かりますか? そこは今後直してもらうとして・・・ 「Table内の文字はリンクになりませんでした」という理由ですが、HyperLink を初期化・設定したものの TableCell の子コントロールに追加してないからです。以下のようなコードを追加して試してみてください。 tableCell.Controls.Add(hl);
ehyai

2016/12/05 11:12

またも回答してくださってありがとうございます。hl.NavigateUrlの後にtableCell.Controls.Add(hl);を追加したらセル内の文字がリンクの形となりクリックすることができるようになりました。しかし、クリックしてもリンクへと飛びませんでした。file:~のようなURLへの変換では、NavigateUrlプロパティに設定してもリンクは飛ばなくて、仮想ディレクトリにファイルの入ったフォルダを入れてhttp:~のようなURLにしなければならないということでしょうか。仮想ディレクトリの設定は自分には難しそうなので、専用のページを作ってそのページを HyperLink.NavigateUrl プロパティに設定すし、ファイル情報はクエリ文字列で渡すという方法を選ぼうと思うのですが、その作るページというのは、新しい項目の追加からWebフォームを選択して作ればよいのでしょうか。そのあたりもまだ理解できていないので、よろしければ教えてもらえないでしょうか。何度も訪ねてしまう形となってしまい、申し訳ありません。
退会済みユーザー

退会済みユーザー

2016/12/05 12:21

問題のフォルダ / ファイルは物理的にどこにあるのですか? Web サーバーと同じマシン内の HDD? 物理的に別のファイルサーバーの共有フォルダ? 後者の場合、アクセス権の設定はどうなっているのですか? ファイルの種類は何ですか? ブラウザで直接開いて見ることができるような、例えば jpg 画像のような静的ファイルですか? 具体的に書いてください。
ehyai

2016/12/05 14:36

最終的には別の場所のフォルダ/ファイルを読み込む可能性がありますが、現時点ではWindowsのCドライブの中のフォルダ/ファイルを読み込もうとしています。ファイルの拡張子は「.c」です。具体的に書くとC言語のソースファイルのコードをブラウザ上で確認できる機能を付けたかったのですが、この拡張子のファイルはブラウザで直接開いて見ることができないから、上手くいかなかったのでしょうか。
退会済みユーザー

退会済みユーザー

2016/12/05 23:59

「別の場所のフォルダ/ファイル」の C ソースをブラウザで見るための Viewer を作ると言うことなら上記 (1) の「表示するための専用のページを作成し、そのページを HyperLink.NavigateUrl プロパティに設定する。ファイル情報はクエリ文字列で渡す」というのがよさそうです。ただし、IIS のワーカープロセスに「別の場所のフォルダ/ファイル」に対するアクセス権(読み取り権限)を与えることが必須ですので、それが可能であることを確認できてからにしてください。 「その作るページというのは、新しい項目の追加からWebフォームを選択して作ればよい」というのはその通りです。例えばアプリケーションルート直下に Viewer.aspx というページを作ったとすると、テーブルの NavigateUrl プロパティを、 hl.NavigateUrl = "~/Viewer.aspx?path=" + Server.UrlEncode(f + "\\" + f2); のように設定してみてください。(f, f2 に日本語が含まれる場合 UrlEncode は必須です) テーブルを表示してハイパーリンクをクリックすれば Viewer.aspx が呼び出され、そのページの Page_Load などで Request.QueryString["path"] とすれば f + "\\" + f2 の文字列を取得できるはずです。
ehyai

2016/12/07 11:12 編集

IISのワーカープロセスにアクセス権を与えるというのが未熟な自分には難しそうですね...。 ずっと教えていただいたSurferOnWwwさんには申し訳ないのですが、実は、あれから作ろうとしていた仕組みが変更することになり、セル内の文字がクリックされたらブラウザでファイルの中身を表示するのではなく、そのファイルをダウンロードできる機能をつけることになりました。ただ、SurferOnWwwさんの詳しい解説のおかげで、HyperLinkを利用した、ブラウザへのファイルの内容の表示の方法を教えてもらえたために、より知識をつけることができたと思います。本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2016/12/07 11:19

「IISのワーカープロセスにアクセス権を与える」というのは、ダウンロードする場合でも同じですよ。
ehyai

2016/12/07 15:15

そうだったのですか。では、IISに関してもう少し勉強してみることにします。ところで、新しい仕組みに関してなのですが、長くなるために上記の追記部分に載せましたが、この方法では実現は叶えられないでしょうか。もしSurferOnWwwさえよろしければ、答えてもらえないでしょうか。何度も訪ねる形となってしまい申し訳ありませんが、よろしくお願いします。また、追記に関して再び質問しなおすこととなるため、一度ベストアンサーを外してもよろしいでしょうか。
退会済みユーザー

退会済みユーザー

2016/12/07 16:22

表題とは質問内容が変わってきているので、表題と違うことは新たに別のスレッドを立てて質問してください。回答が次の疑問を生んで、質問⇒回答⇒別の質問⇒回答・・・を繰り返すのは非常に好ましくないです。最初の質問を書き換えるのも好ましくないです。ここは質問者さん専用の Q&A サイトではなく、情報の蓄積・共有を目的としているそうですので、後から検索などでここを訪れた人が読んで訳がわからないようにしてしまうのはダメです。
ehyai

2016/12/07 16:43

わかりました。もう一度質問しなおして、そちらに書くようにします。問題のある行動をとってしまい、またSurferOnWwwさんに迷惑をかけることになってしまい、申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問