- ベストアンサー
ASP.NETのWebフォーム内で複数のテーブルを使用する方法
- ASP.NETのWebフォーム内で複数のテーブルを使用する方法について教えてください。
- 検索フォームで押されたボタンによって検索キーを変える処理分岐の方法と、テーブルを追加表示する方法について教えてください。
- ASP.NETのWebフォームで複数のテーブルを使い、検索フォームによって表示するテーブルを切り替える方法について詳しく教えてください。
- みんなの回答 (51)
- 専門家の回答
質問者が選んだベストアンサー
検索キーや検索方法を検索ページ側でプロパティまたはコントロールで参照できるようにします 言語はVB.NETとして回答します たとえば TextBox1に検索キー、HiddenField1に検索方法を格納するとします プロパティでやるなら 検索ページ側の VBファイルで Public Readonly Property myKey() as String Get return Text1.Text End Get End Property public readonly property myProc() as String Get return HiddenField1.Value.ToString End Get end Property といった具合にプロパティを準備します ボタンAのClickイベントで HiddenField1.Value = ButtonA.CommandName ボタンBのClickイベントで HiddenField1.Value = ButtonB.CommandName ボタンA・ボタンBの PostBackUrlプロパティを遷移先ページに設定 ボタンA・ボタンBのCommandNameプロパティを遷移先ページに渡したいデータを設定 遷移先ページのaspxをソースビューにして <@ Pasge Langage="VB" @>の次の行に 遷移元ページを示すディレクティブを追加します <%@ PreviousPageType VirtualPath="~/Search.aspx" %> これで Loadイベントなどで PreviusPageで検索設定ページを参照できます VirtualPathなどは適宜修正してください Loadイベントで PreviusPage.myKeyやPreviusPage.myProcなどでデータソースのSelectCommandなどを編集してください プロパティを遷移元ページに設定しないなら dim obnjText as TextBox objText = CType( PreviusPage.FindControl("TextBox1"), TextBox ) strSsqlCommand += "Where ['項目'] like '%" & objText.Txt & "%'" といった具合でコントロールを限定してデータを取得しましょう PlaseHolderのOn/Offなどの設定も PreviusPage.myProcで判断するとかだと思います 具体的に どのテーブルをどんな具合で表示したいのかを投稿してみましょう
その他の回答 (50)
- redfox63
- ベストアンサー率71% (1325/1856)
Web.Configを編集したのでしょうか? 該当部分を投稿してみませんか ・・・
補足
ありがとうございます☆ Web.ConfigはVWDで作成して編集していないのですが。。。 全てを投稿させて頂きます。 <?xml version="1.0"?> <!-- メモ: このファイルを手動で編集する代わりに、Web 管理ツールを使用 してアプリケーションの設定を構成することができます。Visual Studio の [Web サイト] メニューにある [ASP.NET 構成] オプションから設定 を行ってください。設定およびコマンドの一覧は、通常 \Windows\Microsoft.Net\Framework\v2.x\Config にある machine.config.comments で確認できます。 --> <configuration> <appSettings/> <connectionStrings/> <system.web> <!-- デバッグ シンボルをコンパイルされたページに挿入するに は、compilation debug="true" に設定します。この設 定はパフォーマンスに影響するため、開発時のみこの値 を true に設定してください。 --> <compilation debug="true"/> <!-- <authentication> セクションは、ユーザーを識別するため に、ASP.NET で使用されるセキュリティ認証モードの構成 を有効にします。 --> <authentication mode="Windows"/> ←26行目 <!-- <customErrors> セクションは、要求の実行中にハンドル されていないエラーが発生した場合の処理方法の構成を 有効にします。具体的には、開発者が HTML エラー ペ ージをスタック トレースのエラーの代わりに表示するように構 成することを可能にします。 <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> --> </system.web> </configuration> 26行目は<authentication mode="Windows"/>の部分です。 宜しくお願い致します☆
- redfox63
- ベストアンサー率71% (1325/1856)
エラーの一覧にあるその項目(・アプリケーションレベルを超えて ・・・)の『ファイル』『行』『列』『プロジェクト』などどのように表示されているのでしょう 実行時のエラーですが left.aspxに貼り付けた『Buttonコントロール』で呼び出しているのですよね … 自作のプロパティって myTypeなのでしょうか? myKeyOneとmyProcOne ではありませんか …
補足
ありがとうございます☆ アプリケーションレベルを超えて ・・・のエラーはleft.aspxを実行した時に発生しています。 ファイル名はWeb.Config 行は26と記載されております。 left.aspxのボタン部分は <asp:Button ID="ButtonA" runat="server" OnCommand="ButtonA_command" Text="検索実行" PostBackUrl="~/Serch_View.aspx" CommandName="契約番号" Width="78px" /> のままになっております。 自作のプロパティはmyKeyOneとmyProcOneでした。。。 失礼致しました。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
CType(PreviousPage.FindControl("ButtonA"),Button).Text は PreviousPageで myKeyOneなど自作プロパティが取得できないため旧来の方法で確認できるかなと思って投稿したしだいです 現在は自作プロパティも表示できるのですよね であれば 以前に構築していたSQLで良いように思いますよ ORDER BY句を最後にすることをお忘れなく
補足
ありがとうございます☆ 以前教えて頂いたSQLを記述して実行してみるとやはりdim sType As String= PreviousPage.MyType()の所が黄色になり NullReferenceExceptionはユーザーコードによってハンドルされませんでした。とのエラーがでました。 Serch_View.aspxを単独で実行しても同じエラーが出ます。 VWDの下にあるエラー一覧にこの様なエラーがずっと出ているのは関係あるのでしょうか? ・アプリケーションレベルを超えて allowDefinition='MachineToApplication'として登録されているセクションを使うことはできません。このエラーは、仮想ディレクトリがIISでアプリケーションとして構成されなかった場合に発生します。 IISマネージャにて確認した所、アプリケーションの作成が削除になっているのでWEBアプリケーションは作成されていると思うのですが・・・
- redfox63
- ベストアンサー率71% (1325/1856)
迷惑だとは思ってませんよ ただ情報の出し方をもう少しお考えになったほうが良いかも知れません と言うのも『○○でエラーがでました』と言うだけでは回答者側には何も伝わりませんよね しょうがないので『どのようなエラーですか』などの返答になってしまいます 5W1Hを考えて返答をお願いできればと考えます
補足
redfox63さま ありがとうございます☆ >ただ情報の出し方をもう少しお考えになったほうが良いかも知れません 仰る通りですね。 こちらが同じ立場であった場合には同じ事を感じると思います。 redfox63さまのように分かりやすく何度もご説明頂ける方を大切にしてご回答をさせて頂く事が必要であったのにもかかわらず、申し訳ありませんでした。 今後、気をつける様に致します。 先日、ご教示頂きましたCType(PreviousPage.FindControl("ButtonA"),Button).Textというのは値を確認する為にご用意頂いたソースだったのでしょうか? SQLにどうプロパティを組み込んでいいのか迷っておりまして。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
当方の環境にも VWDを突っ込んでみましたが当然のごとくまともに動いてしまいました … Left.aspxを作成してから ビルド > Webサイトのビルド を実行します これにより ASP.left_aspxクラスを DLLとして構築します その後 Search_View.aspxの冒頭で PreviousPageTypeディレクティブの記述をします ここでもう一度念のため『Webサイトのビルド』を実行します Serach_View.aspx.vbにコードを記述します Loadイベントなどで 『PreviousPage.』として表示されるインテリセンスの中にleft.aspx.vbに追加した プロパティが表示されませんか 当方では ここで表示されますよ ん~ どうしても同じ状況が作れませんね … もしかして 作成したプロパティのアクセス指定子の『Public』を忘れてたりしませんよね
補足
ありがとうございます☆ Webサイトのビルドは失敗しました・・・ Web.Configのエラーがでました。 これ以上、redfox63さまにご迷惑はお掛けできないのでMSDNのVWDで尋ねてみます。。。 とりあえず今はローカル環境でこのまま作っていきますのでアドバイス宜しくお願い致します! インテリセンスの中にleft.aspx.vbに追加したプロパティが表示されました。 宜しくお願い致します☆
- redfox63
- ベストアンサー率71% (1325/1856)
変数でかまいませんよ LoadイベントでPreviousPageが left.aspxを指しているはずなのを確認したいわけです #24の3つをLabelなどに書き出して期待通りになっているか確認してみてください
お礼
あ。。。 すみません! Serch_View.aspxのソースで最初の方に記載した dim sType As String = PreviousPage.myType() dim sParam As String = PreviousPage.myParam() にブロックをかけたらエラー無しで以下の情報が表示されました。 Label1:検索実行 Label2:契約番号 Label3:left.aspxにてテキストボックスに入力した契約番号 宜しくお願い致します!
補足
ありがとうございます☆ Label1 = CType(PreviousPage.FindControl("ButtonA"),Button).Text Label2 = CType(PreviousPage.FindControl("HiddenFieldA"), HIddenFireld).Text Label3 = CType(PreviousPage.FindControl("ValueToPassOne"),TextBox).Text と書いてみましたがLabel2 = CType(PreviousPage.FindControl("HiddenFieldA"), HIddenFireld).Textのみ エラーが出てしまいましたのでLabel2 = CType(PreviousPage.FindControl("HiddenFieldA"), HIddenFireld).Value にしました。 実行してみるとNullReferenceExceptionのエラーが出てしまいました。 知識不足で申し訳ありません。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
そうです SearchView.aspx.vbの Loadイベントで実行するようにしてみてください FindControlは ページ内に組み込まれているコントロールをIDで識別して探します これは Object型で返してきますので TextBoxやCommandButton、HiddenFieldに型変換して 型固有のプロパティにアクセスします
補足
ありがとうございます☆ LoadイベントのSQLに組み込むのでしょうか? dim rs as CType(PreviousPage.FindControl("ButtonA"),Button).Text の様に変数を当てるという形でしょうか? すみません。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
CTypeで型キャストしないとダメでしたね CType(PreviousPage.FindControl("ButtonA"),Button).Text CType(PreviousPage.FindControl("HiddenFieldA"), HIddenFireld).Text CType(PreviousPage.FindControl("ValueToPassOne"),TextBox).Text と言った具合で …
補足
ありがとうございます☆ これ・・・ 移行先(Serch_View.aspx)に書くのでしょうか? すいません。 見たことのないのが出てきたものですから。 VirtualPath設定はローカルにファイルを移動したので改めて 書き直してみたいと思います。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
ん~ どうしてでしょうね … PreviousPage.FindControl("ButtonA").Text PreviousPage.FindControl("HiddenFieldA").Text PreviousPage.FindControl("ValueToPassOne").Text これでデータが取得できるようなら 前ページ自体は設定できていると思います これで 自作のプロパティが見えないのであれば VirtualPath設定ぐらいしかなさそうなんですけどね
- redfox63
- ベストアンサー率71% (1325/1856)
Clickイベントは汎用イベントハンドらなので引数のeはSystem.EventArgsになっています Commandイベントはボタン専用のイベントで引数eはCommandEventArgsになっています CommandEventArgsにはこのイベントのコントロールに設定されたCommandAgument、CommandNameなどを参照できます これの利点は 複数のボタンで1つのハンドラを共有できると言ったことです 今回のように ボタンAでは『名前』で検索、ボタンBでは『所在地』で検索など行う処理自体は同じな共有化が出来ます HiddenFieldA.Value = e.CommandName と言った具合にしておけば ボタンAで呼ばれてもボタンBで呼ばれても同じコードの実行ですみます
補足
ありがとうございます☆ VBファイルの %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Protected Sub ButtonA_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonA.Click HiddenFieldA.Value = ButtonA.CommandName End Sub %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% を削除して %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sub ButtonA_command(ByVal sender As Object, ByVal e As CommandEventArgs) HiddenFieldA.Value = e.CommandName End Sub %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% へと変更しました。 aspxファイルは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <asp:Button ID="ButtonA" runat="server" OnCommand="ButtonA_command" Text="検索実行" PostBackUrl="~/Serch_View.aspx" CommandName="契約番号" Width="78px" /> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% へと変更しました。 やっぱりあのエラーが出てしまいます。。。 NULLって事は値が来ていないのでしょうか??
お礼
すみません。。。 プロパティを遷移元ページに設定しない場合はサンプルでいう→SqlCommand comm = new SqlCommand("SELECT isbn,title,publish FROM books ORDER BY published DESC", db);をご教示頂いたソースでコントロールすると言う事でしょうか? 理解が乏しく申し訳ありません。 表示希望はこのサンプルのPage_Load時の一覧にテーブルが増えた感じです。 -------------------------------- booksカラム -------------------------------- books -------------------------------- books1 -------------------------------- books2 -------------------------------- booksの詳細が押下されたらbooksの一覧をbooks1の詳細が押下されたらbooks1の一覧を表示させたいです。 どうか宜しくお願い致します。
補足
redfox63さん ありがとうございます! ちょっと難しい感じがしてしまいました。。。 月曜日がんばって試してみます。 またご質問させて頂くと思いますが宜しくお願い致します。