- ベストアンサー
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)
テキストボックスへの入力を渡すのではないでしょうか? myKeyOneは return TextBox1.Text になりませんか またボタンAのClickイベントより Commandイベントホノウが良いかもしれません Commandイベントなら 引数のeで CommmandNameなどを参照できます
補足
>テキストボックスへの入力を渡すのではないでしょうか? そうですね! 間違えてました。。。 Public ReadOnly Property myKeyOne() As String Get Return ValueToPassOne.Text End Get End Property こうですね☆ redfox63さまの環境でできていらっしゃったのであればこちらのソースが違っていると思い確認して頂いた次第でございます。 ありがとうございます。 Commandイベントですか? Clickイベントとは違うものですよね?
- redfox63
- ベストアンサー率71% (1325/1856)
おかしいですね 当方VWDは使用していないので同じ現象が確認できません VS2005でAP.NETサイトを新規構築すると App_Dataフォルダ Defualt.aspx Web.Config が作成され サイトのビルドなどを行うと Binフォルダに関連DLLが構築されます すみません 私一人ではフォローし切れません m(__)m MSDNフォーラムのVWD EE辺りに投稿してみてはいかがでしょう
補足
ありがとうございます☆ >VS2005でAP.NETサイトを新規構築すると App_Dataフォルダ Defualt.aspx Web.Config が作成され 合っているので安心致しました☆ テキストボックスの値を持ってきていない気もするので検索側のソース見て頂いて宜しいでしょうか? お願い致します! 合っていればまた別の場所への投稿も考えてみます。。。 @@@@@@@@@@@@@@@@@@@ left.aspx(ラベル・テキストボックス・ボタン) @@@@@@@@@@@@@@@@ <tr> <td align="left" style="height: 58px;"> <asp:Label ID="Label2" runat="server" Text="契約番号" Width="150px" style="text-align:center"></asp:Label></td> <td align="left" style="height: 58px"> <asp:TextBox ID="ValueToPassOne" runat="server" Width="170px"></asp:TextBox> <asp:HiddenField ID="HiddenFieldA" runat="server" /> </td> <td align="left" style="width: 25px; height: 58px"> <asp:Button ID="ButtonA" runat="server" Text="検索実行" PostBackUrl="~/Serch_View.aspx" CommandName="契約番号" Width="78px" /> </td> <td align="left" style="width: 35px; height: 58px"> <asp:Button ID="Button1" runat="server" Text="クリア" /></td> </tr> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ left.vb @@@@@@@@@@@@@@@@@@ Partial Class left Inherits System.Web.UI.Page _____________________________________________ Protected Sub ButtonA_Click(ByVal sender As Object,ByVal e As System.EventArgs)Handles ButtonA.Click HiddenFieldA.Value = ButtonA.CommandName End Sub ___________________________________________ Public ReadOnly Property myKeyOne() As String Get Return ButtonA.Text End Get End Property ___________________________________________ Public ReadOnly Property myProcOne() As String Get Return HiddenFieldA.Value.ToString End Get End Property End Class @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- redfox63
- ベストアンサー率71% (1325/1856)
VWDのビルドメニューに『サイトの発行』と言うメニューがあるはずです これをクリックしてサーバーへアップしましょう ターゲットの欄に http://サーバー名/data/webappl/Test/ と言った具合にすれば良いでしょう たぶん binフォルダーとかの中身がアップデートされていないのではないかと思います DLLをBinフォルダに入れて これを参照しながら動作するはずなので PreviousPageを取得するのに失敗しているのではと思います まず確実に動くように ローカルのIISで開発したほうが良いように思いますよ
補足
おはようございます。 お返事遅れまして申し訳ありません。 ご回答感謝致します☆ WEBサーバーアップは完成後にしてとりあえずはローカル環境での完成を目指します。 WEBサーバーのフォルダは削除してローカルに持ってきたのですがやはり NullReferenceExceptionはユーザーコードによってハンドルされませんでした。とのエラーがでました。。。 そもそものサイトの作り方が駄目なのでしょうか? 新しいWEBサイト→ASP.NET Webサービスといった具合で作成しているのですが・・・。 新しいWEBサイト→ASP.NETのWEBサイトで作成するとweb.configがなくエラーが出てしまうので(^ ^;) ご教示頂けますでしょうか?
- redfox63
- ベストアンサー率71% (1325/1856)
ん~ どうも配置手順に問題があるのかなぁ 直接 VWDのプロジェクトを Webサーバに構築したのでしょうか そうであるなら VWDで『サイトのビルド』または『サイトのリビルド』を実行してDLLの更新をしてみたほうが良いかも もしかして 直接 Search_View.aspxをIEのアドレスバーに入力して表示していませんか そうなると PureviousPageはNothingつまり何も無い状態なのでエラー(NullRefelenceException)になりますよ 同じフォルダにあって アプリケーションルートが Testまでなら VirtualPathは 『~/left.aspx』でいいはずですね PostBackで表示させるのが前提になっています IEのアドレスバーで『Web』が無くなるのはWebサーバ側の公開方法によるものかもしれません 仮想ディレクトリで切ってあるのかも たとえば D:\Web\Dataを サーバー/dataで公開しているとか
補足
redfox63さま ありがとうございます。 あまり記憶にはないのですが・・・ VWDで「新しいWEBサイト」でフォルダを作成しそこに作ったか Cドライブなどに作ったファイルをそのままWEBサーバーに配置したかどちらかだった気がします。。。 サイトのビルドですか? 正常に作られていないのでしょうか。。。 IEのアドレスバーに入力するのはleft.sapxで検索にて値を入力してボタンでSearch_View.aspxに移行していますので直接は入力していないです。 会社の公開方法は分らないのですが仰る通り仮想ディレクトリで切ってあるのだと思われます。 本当にすみません。。。 よろしくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
> \\WEBサーバー\web\Data\webappl\Test\ このWebアプリのルートが何処になりますか? 1) \\WEBサーバー\web\Data\webappl\がルートなのか 2) \\WEBサーバー\web\Data\webappl\Test\までがルートなのか 1の場合なら ~/left.aspxとすると WEBサーバ/web/data/webappl/left.aspx Test/left.aspxに配置してあるなら ~/Test/left.aspxとします 2の場合なら ~/left.aspxとすると WEBサーバ/web/data/webappl/Test/left.aspx となります
補足
ありがとうございます☆ ファイルのルートは\\WEBサーバー\web\Data\webappl\Test\までとなっております。 仰る通りその場合なら WEBサーバ/web/data/webappl/Test/left.aspxとなるので IE表示のURLは http://WEBサーバ/web/data/webappl/Test/left.aspx なのですが会社のWEBは http://WEBサーバ/data/webappl/Test/left.aspxで表示がされます。 すみません。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
ん~ … VWDで実行して NullRefelenceExcptionが発生するなら やはり VirtualPathで設定したページのURLが違っているのだと思います PreviousPageはPageオブジェクトのプロパティとして.NET Frameworkに組み込まれています myType()は独自に組み込んだプロパティなので Pageクラスには存在しません したがって VWD(ASP.NET)は『そんなの知らないぞ』エラーが発生します 検索条件を入力するページのURLはどうなっていますか これが分からないと アドバイスの使用がありません サーバー名/Webアプリケーション名/Test/Web/Left.aspx これが条件入力のページなのでしょうか … きちんと設定できていれば IEから単独実行しても動作します ローカル IISに配置して開発を行ったほうが効率的だと思いますよ デバッグが終了してからプロジェクトを発行してやれば本番サーバへの移行もさほど難しくありません
補足
redfox63さま ありがとうございます。 助かります。 NullRefelenceExcptionが発生するならうまくいった訳ではないのですね・・・ 現在検索条件を入力するページ(left.aspx)のURLは仮としますが <asp:Button ID="ButtonA" runat="server" Text="検索実行" PostBackUrl="~/Serch_View.aspx" CommandName="番号" Width="78px" /> 表示側(serch_View.aspx)ですがVBに <%@ PreviousPageType VirtualPath="~/left.aspx" %> と書かれています。 Left.aspxとserch_View.aspxが配置してある場所は共に同じで \\WEBサーバー\web\Data\webappl\Test\ となっております。 ですのでIEでのleft.aspx実行時は http://WEBサーバー/Data/webappl/Test/left.aspx と入力して表示されています。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
ソリューションエクスプローラで表示されている階層構造がVirtual Pathと合致していますか 検索条件を入力するページは何処においてあるのでしょう たとえば このWebアプリのルートが http://localhost/TestWeb01 だとします 条件入力のページが Test/Data/SearchInput.aspxでしょうか http://localhost/TestWeb01/Test/Data/SearchInput.aspx がフルパスです ~アプリケーションルート演算子を使うなら ~が localhost/TestWeb01 と置き換わるので ~/Test/Data/SearchInput.aspx と表現できるわけです
補足
redfox63さん ありがとうございます。 VWDの環境内での実行と言う事ですね。。。 すみません。今までWEBサーバー上にファイルを置いてVWDの環境内での実行ではなくIEから実行していました。 本当はIEから本番の様に実行してもエラーはでないのでしょうか?? またVWDにて実行した所 dim sType As String= PreviousPage.MyType()の所が黄色になり NullReferenceExceptionはユーザーコードによってハンドルされませんでした。とのエラーがでました。 検索しても分からなかったので何度もすみませんがどうかご教示下さい。
- redfox63
- ベストアンサー率71% (1325/1856)
VWDなら大丈夫だと思うのですが … <%@ PreviousPageType VirtualPath="~/Web/Test/Left.aspx" %> の VirtualPathの記述があっていないのではないかと思います VWDってインテリセンスが利きましたっけ? <%@ PreviousPageType VirtualPath= と入力した際に そのフォルダーにあるファイル名と『URLの選択』といったドロップダウンリストが表示されますか? ここで Left.aspxが表示されているのでしょうか 上記のPreviousPageTypeディレクティブを正確に書き終えてから ビルド > サイトのビルドを実行します インテリセンスが利くのであれば スクリプト中に PreviousPage. と入力すると プロパティやメソッドの候補が現れます この中に myKeyOneやmyProcOneがあるはずなんですが …
補足
ありがとうございます! <%@ PreviousPageType VirtualPath="~/Web/Test/Left.aspx" %>が問題の様です。。。 インテリセンスは利きますので<%@ PreviousPageType VirtualPath= と入力した際にファイル名のドロップダウンリストが表示されました。 そこでLeft.aspxが表示されたのでそれを選択しました。 すると並線は消えましたが実行すると「/test/serch.aspxは存在しません」と表示されたので少し変えたのだと思います。 <%@ PreviousPageType VirtualPath=のURLを少しでも変更するとまた並線が出るので原因はこれだと思います。 ご教示下さいませ。
- redfox63
- ベストアンサー率71% (1325/1856)
お使いの開発環境って何でしょう? もしかしてWebMatrixですか、それとも VS2003なのでしょうか VS2005 ASP.NET2.0として回答してましたが … ASP.NET 1.0/1.1なら Sessionでデータ渡すって方法になりそうですが
補足
ありがとうございます。 環境はVisual Web Developer 2005 EEです。 バージョンはASP.NET2.0になります。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
当方の環境では うまく動作していますよ AccessのNothwind.mdbをアップサイジングしたデータベースの得意先テーブルで dim sType As String = PreviousPage.myType() dim sParam As String = PreviousPage.myParam() cmd.CommandText = "SELECT 得意先コード,得意先名,都道府県 FROM 得意先 " cmd.CommandText += "Where (" + sType + " = N'" + sParam + "') " cmd.CommandText += "ORDER BY 得意先コード DESC" ソートの指示の位置が悪いようですよ ORDER BY 句を一番最後にに持ってきたほうが良いようです ラベルコントロールを貼り付けて cmd.ExecuteReader()などはコメントアウトしておいて Label1.text = cmd.CommandText と言った具合にしてみてはいかがでしょう 期待通りの文字列でしょうか
補足
redfox63さま 何度も申し訳ありません。 ありがとうございます。 既存のコードで試してみましたが「Label1」にはLabel1としか表示されませんでした。。。 違うと思いredfox63さまに投稿いただきましたコードを改良したのが現在のコード(以下)です。 すると次は別のエラーが出てしまいました。。。 前から思っていたのですがDeveloperでは「PreviousPage.myProcOne」や「PreviousPage.myKeyOne」が 波線になっており、'PreviousPage.myKeyOne'は'System.Web.ULPage'のメンバではありません。 と表示されているのですが関係はありますでしょうか? 宜しくお願い申し上げます。 --------------------------現在のコード--------------------------- <%@ Page ContentType="text/html" Language="VB" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ PreviousPageType VirtualPath="~/Web/Test/Left.aspx" %> <script runat="Server"> Dim table As Hashtable Dim reader As SqlDataReader Dim aParam As String = PreviousPage.myKeyOne() Dim comm As New SqlCommand Dim btn As String Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) If PreviousPage.myProcOne = "ButtonA" Then btn = "番号" Dim db As New SqlConnection("Server=Sorce;database=Name;UID=id;PWD=pw") comm.CommandText = "SELECT 管理番号,日付,区分,番号,申込者 FROM TABLE " comm.CommandText += " Where (" + btn + " =N'" + aParam + "')" comm.CommandText += "ORDER BY 日付 DESC" db.Open() ' 取得したDataReaderオブジェクトを ' DataGridコントロールにバインド Label1.Text = comm.CommandText grid.DataBind() db.Close() End If End Sub ------------------------------ここまで-------------------------------- ------------------------------エラー内容----------------------------- 説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。 エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 例外の詳細: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 ソース エラー: 行 9: Dim table As Hashtable 行 10: Dim reader As SqlDataReader 行 11: Dim aType As String = PreviousPage.myProcOne() ※ 行 12: Dim aParam As String = PreviousPage.myKeyOne() 行 13: Dim comm As New SqlCommand -----------------------------ここまで-----------------------------------
お礼
すみません。。。 プロパティを遷移元ページに設定しない場合はサンプルでいう→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さん ありがとうございます! ちょっと難しい感じがしてしまいました。。。 月曜日がんばって試してみます。 またご質問させて頂くと思いますが宜しくお願い致します。