- PR -

DetailsView内でファイルをアップロードをする場合のパラメータの渡し方について

投稿者投稿内容
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-11-13 21:53
どっとねっとふぁんさん、どうもありがとうございます。

もしかして、参考にさせてもらったサイトのオーナーさんはどっとねっとふぁんさんでしょうか?お世話になっております。m(__)m

結局、GridViewの追加行に関しては、頂いたアドバイスの通りFindControlでやることにしました。また試行錯誤の結果、ObjectDataSourceにパラメータを埋め込む方法はあきらめて直接ビジネスロジック層のオブジェクトのInsert用メソッドに値をセットして呼び出すことにしました。RowCommandのコードは以下の通りです。

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
 Product product = new Product();

 switch (e.CommandName)
 {
  ・・・・
  case "Insert":
   CheckBox visible = (CheckBox)GridView1.FooterRow.FindControl("NewVisibleCheck");
   FileUpload image = (FileUpload)GridView1.FooterRow.FindControl("NewFileUpload");
   TextBox title = (TextBox)GridView1.FooterRow.FindControl("NewTitleBox");
   TextBox description = (TextBox)GridView1.FooterRow.FindControl("NewDescriptionBox");

   product.InsertData(visible.Checked.ToString(), image, title.Text, description.Text);
   break;
   ・・・
 }

 GridView1.DataBind();
}

GridViewのFooterからコントロールを取り出すのはAccessさんのサイトで似たサンプルを見つけたのでそれを使ってみました。Accessさんどうもありがとうございました。m(__)m

ここでもやはり取り出した後、FileUploadをどうやってパラメータとして渡すか悩んだのですが、結局元々GridViewでサポートされていないInsertを無理矢理ObjectDataSource経由でやるのは無理があるように感じましたのでVS2003の時と同じようなやり方に落ち着きました。Insertについてはまあ仕方ないのかなと思います。
(前回書いた、「ObjectDataSource1.InsertParameters.Add(new ControlParameter(・・・));」は断念)

これでGridViewに関してもアップロードも含めた追加・編集ができるようになったので、今後いろいろなパターンに応用ができるようになったのですが、今回試したことに関して、何点か不明な点がありますので、後学のためよろしければご教授ください。

第一に、GridViewのFooterから値を取り出す方法ですが、Request.Form.AllKeysを使うサンプルの方が多数派?のような印象です(本家Microsoftの「プログラム簡単レシピ」もこの方式です)。GridView1.FooterRow.FindControlを使わない理由というか、両者に何か機能的な違いや得失があるのでしょうか?

二番目に上とも関係しますが、どうやらRequest.Formでは<input type="file">は拾えないようです。確かに、ASPにおいてはBASP21とかを使わないとできなかったような記憶があります(随分前なので記憶が薄れつつありますが)。ASP.NETではRequest.Formは使わなくなってしまったのでASPと同等かどうかはよく知らないのですが、ダメな理由はそれと同じことと考えてよいのでしょうか?だとすると、GridView1.FooterRow.FindControlを使っておいた方が無難ということでしょうか?

何度もすみませんがよろしくお願いします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-14 00:34
> GridView1.FooterRow.FindControlを使わない理由というか、両者に何か機能的な
> 違いや得失があるのでしょうか?

特に違い等はないと思います。
HTMLを読める人ならRequestデータを解析するほうがわかりやすいかな、と思いますけど。
私の記事で最初Requestデータを解析してるのは、GridView1.FooterRow.FindControlと
いう方法があるのを知らなかったからだったりします。

> どうやらRequest.Formでは<input type="file">は拾えないようです。

ページのトレースを表示させるとブラウザからどのようなリクエストがあがっているかも
みることができるのですが、これでみてもRequest.Formで取れる形ではあがってないですね。
フォームがマルチパートになっているのでそれをうまく取り出すとかの処理が必要なのかな?
まぁ、FileUploadコントロールの状態を取り出すほうがよさそうです。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-11-14 01:29
納得いたしました。

GridView,DetailsViewについては、これで基本的な追加・編集はできるようになったと思います。まだ細かなところで若干不明な点が残っているのですが、これはまた別スレッドにしたいと思います。
また、残っているFormViewについては、今後やってみて参考になりそうなことが判りましたら、まとめという意味でこのスレッドにアップしたいと思います。

いろいろと、どうもありがとうございました。

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