- ベストアンサー
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)
btnに[]が入っているのが原因だろうと思います 先の投稿で フィールド名に[]を付けたのは 当方がテストしたのが AccessMDBだったためです btnには フィールド名だけが入るようにしてみてください たとえば btn = "番号" と言った具合です
補足
ありがとうございます☆ 試してみましたが同じエラーが出てしまいます・・・ PreviousPage.myKeyOneを見ていないのでしょうか? すみません。 宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
ボタンAまたはボタンBどちらが押されたのかを判断するための材料をCommandNameプロパティに割り当てておきます たとえば ボタンAが押されたら名前フィールドの検索 ボタンBが押されたらアドレスフィールドの検索 と言った具合になるように 遷移先のページで btnに取得しているデータがこれにあたります もしかしたら Where句の フィールド名とデータの関係演算子が無いのがエラーの原因かもしれませんよ comm.CommandText += " Where " & btn & "= N'" & PreviousPage.myKeyOne & "'" と言った具合で N' と btn の関係を記述しましょう 変数 btnに 関係演算子が 入っているなら原因はまた別のものですね
補足
ありがとうございます。 CommandNameは触らずに以下の様に変えてみました。 If PreviousPage.myProcOne = "ButtonA" Then btn = "['番号']" End If comm.CommandText += " Where " & btn & "= N'" & PreviousPage.myKeyOne & "'" すると次は' '付近に不適切な・・・とエラーが変わりました。 btnに関係演算子が入っているか分からないのですが・・・ 何度もすみません。
- redfox63
- ベストアンサー率71% (1325/1856)
サーバーエクスプローラや SQL マネジメントスタジオなどで クエリーを実行してみて期待通りの結果が得られるのか確認します Labelコントロールなどに Comm.CommandTextを表示させて見ましょう 期待通りの文字列になっているのか確認します
補足
何度もありがとうございます。 >サーバーエクスプローラや SQL マネジメントスタジオなどで クエリーを実行してみて期待通りの結果が得られるのか確認します やり方が分からないので調べて試してみます。。。 1つ思ったのですが移行元のコードでプロパティを設定する部分を教えて頂きました。 Protected Sub ButtonA_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonA.Click HiddenFieldA.Value = ButtonA.CommandName End Sub このコードのCommandNameというのはこのままでよろしいのでしょうか? 先日のご回答にCommandNameはプロパティを遷移先ページに渡したいデータを設定と記載されておりましたので。。。 ご回答お願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
> WHERE (フィールド名 = N'データ') ですので comm.CommandText += " WHERE " & btn & "N'" & PreviousPage.myKeyOne & "'" といった具合に Nの後ろに'で括った文字列になります
補足
redfox63さん ありがとうございます! お返事遅くなりました。。。 色々試したのですが次は「WHEREN」付近に不適切な構文があります。 となってしまいます。 btnの変数を見に行ってないのでしょうか??
- redfox63
- ベストアンサー率71% (1325/1856)
Where句の部分は SQLサーバーの場合 WHERE (フィールド名 = N'データ') といった具合のようです フィールド名のSQLサーバーでのデータ型によって 右辺の形式は異なるようです 文字型なら N'データ' 数値型の場合単純に数値といった具合です
お礼
ありがとうございます! データは文字型なのでWHERE (フィールド名 = N'データ')ですね。 comm.CommandText += " WHERE " & btn & "'" & "N" & PreviousPage.myKeyOne & "'" になるのでしょうか?? エラーが出ますのでやっぱり違いますね。。。 難しいですね(^ ^;)
- redfox63
- ベストアンサー率71% (1325/1856)
スペルのタイプミスがあったようです <@ PreviousPageType VirtualPath="URL" @> コードでは if PreviousPage.MyProc = "ボタンA" then Previusではなく Previousでした oが抜けてましたね m(__)m
補足
redfoxさん ありがとうございます! 試したみたのですがエラーがでます。。。 多分SQLの辺りが理解できていないかと・・・ すみません。 --------------------------------------------------------- キーワード 'WHERE' 付近に不適切な構文があります。 説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 例外の詳細: System.Data.SqlClient.SqlException: キーワード 'WHERE' 付近に不適切な構文があります。 ソース エラー: 行 32: ' 取得したDataReaderオブジェクトを 行 33: ' DataGridコントロールにバインド 行 34: reader = comm.ExecuteReader() 行 35: grid.DataBind() 行 36: db.Close() --------------------------------------------------------- 現在教えて頂いた要所のコードを記載させて頂きます。 お気づきの点をご教示下さいませ。 【移行元】 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 ValueToPassOne.Text End Get End Property ------------------------------------------------ Public ReadOnly Property myProcOne() As String Get Return HiddenFieldA.Value.ToString End Get End Property 【移行先】 Dim table As Hashtable Dim reader As SqlDataReader Dim btn As String Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) If Not Page.IsPostBack Then 'ファイル日付フィールドの昇順にデータを取得 Dim db As New SqlConnection("Server=serverName;database=Source;UID=ID;PWD=PW") Dim comm As New SqlCommand("SELECT 管理番号,日付,番号,電番 FROM TABLEA ORDER BY 日付 DESC", db) 'OCN契約番号が押された場合 If PreviousPage.myProcOne = "ButtonA" Then btn = "['番号']=" End If comm.CommandText += " WHERE " & btn & "'" & PreviousPage.myKeyOne & "'" db.Open() ' 取得したDataReaderオブジェクトを ' DataGridコントロールにバインド reader = comm.ExecuteReader() grid.DataBind() db.Close() End If End Sub 本当に何度も申し訳ありません。 何卒、よろしくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
> PostBackUrl="http://server/WEB/data/test/Serch_View.aspx "は PostBackUrl="~/data/test/Serch_View.aspx" で良いかともいます PreviusPageTypeのVirtualPathも同様の変更が必要でしょう 2に関して Elseif ってのはおかしいと思いますよ ここが評価されるってことは reader_desc.Read()が Falseを返した際ということになりませんか? 書くとしたら If reader_desc.Read() Then ' 行が存在する場合 ID.Text = reader_desc.GetInt32(0) 日付.Text = reader_desc.GetString(1) ' 廃止月が DBNull値かチェック If reader_desc.GetString(2) IsNot System.DBNull.Value Then ' 廃止月が DBNull値でないなら 廃止月.Text = reader_desc.GetString(2) End If End If といった具合かと ・・・
補足
ありがとうございます!! PostBackUrlはうまく作動しました☆ >ここが評価されるってことは reader_desc.Read()が Falseを返した際ということになりませんか? おっしゃるとおりですね。 ここは私が勘違いしておりました。 すみません。。。 ところでif previusPage.myProc = "ボタンA" then を記述した所、previusPageは宣言されていませんとエラーが出ました。これは宣言が必要なのでしょうか?? もう最後となると思いますのでどうか宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
> PostBackUrl="~/Serch_View.aspx" とかかれていますが ASP.NETのこのアプリケーションのルートが 『http://server/WEB/』ではありませんか? ~/は アプリケーションルートの代用だともいます aspxファイルの置き場所がアプリケーションルートなのですか? それとも ルート/data/test/ に置いてあるのでしょうか 2に関して どこどのようにしたいのでしょう 空白が表示されるのを『未登録』などと表示したいとか ・・・
補足
ご回答ありがとうございます。 分かりにくいご説明で申し訳ありません。 aspxファイルの置き場所は\\server\MC\WEB\data\test\Serch_View.aspxとなっております。 PostBackUrl="http://server/WEB/data/test/Serch_View.aspx"とすると移行しますが遷移先ページ<%@ PreviousPageType VirtualPath="~/Serch_View.aspx" %>でエラーとなってしまいました。。。 宜しくお願い致します。 2に関しましてはサンプルURLで言う一番下の詳細画面の画像部分の事を指しております。(サンプルコードで ' 取得したDataReaderオブジェクトの内容を ' Labelコントロールに反映と言う所です。) この詳細画面の表示時に廃止月というデータがテーブル上で存在する場合は表示されたのですがテーブルのデータ上でNullだった場合にアプリケーションエラーが出ました。 エラー内容は忘れてしまいましたがNullがあるからみたいな感じでした。 そこでこの部分を以下のコードに変更してみました。 If reader_desc.Read() Then ID.Text = reader_desc.GetInt32(0) 日付.Text = reader_desc.GetString(1) ElseIf reader_desc.GetString(2) Is System.DBNull.Value Then 廃止月.Text = reader_desc.GetString(2) End If すると廃止月というデータがテーブル上で存在していてもしていなくも空白が表示される様になったというご説明でした。 お分かり頂けましたでしょうか??
- redfox63
- ベストアンサー率71% (1325/1856)
commを作成するのはその構文で良いと思います 遷移元のページ指定した文言(テキストボックスのデータ)を使って絞込みを行うのですよね たとえば titleとかpublishとかのフィールドに対して一致しているものとか このフィールドの選択に遷移元ページでクリックしたボタンを使うのだと理解したのですが違いますか 上記の解釈であっているのでしたら どのボタンを押したかを 遷移元ページで覚えておく必要がありますよね その役割を HiddenFieldに持たせSQLの『WHERE句』に与えようと考えました 最初の回答の ['項目'] とした部分を入れ替えるといったことです dim s as String if previusPage.myProc = "ボタンA" then ' ボタンA が押された場合 s = "['title'] = " else ' ボタンB が押された場合 s = "['publish'] = " end if comm.CommnadText += "Where " & s & "'" & previusPage.myKey & "'" といった具合です
補足
redfox63さま ありがとうございます☆ 分かりやすいご説明感謝いたします。 実際、触ってみると分かる様になってきました。 2点ご教示頂けますでしょうか? 1、ボタンをクリックした際に次のページには移行するのですがURLが切れて移行してしまいます。 http://server/WEB/data/test/Serch_View.aspx ⇒ http://server/WEB/Serch_View.aspx となってしまいます。何が原因なのでしょうか? 現在のソースはこの様になっております。<asp:Button ID="ButtonA" runat="server" Text="検索実行" PostBackUrl="~/Serch_View.aspx" CommandName="番号" /> またHiddenFieldA.value = buttonA.commandNameのcommandNameは検索キーのフィールド名でよろしいのでしょうか? 2、実行して一覧が表示され詳細を押下した段階でNullがあるとエラーになりました。 そこでNullの項目を以下のように書いてみた所、エラーは解消されたのですが 次は値がNULLではなくても項目が空白になってしまいました。 どのように記述させて頂けば宜しいでしょうか? If reader_desc.Read() Then ID.Text = reader_desc.GetInt32(0) 日付.Text = reader_desc.GetString(1) ElseIf reader_desc.GetString(2) Is System.DBNull.Value Then OSM廃止月.Text = reader_desc.GetString(2) End If 何度も大変お手数なのですが宜しくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
そうです 構築した commの CommandTextプロパティに『WHERE句』を追加することになると思いますよ # 私が勘違いしているのでしょうか 4つのテーブルの表示に関してはクリックした際の動作は 1) この4テーブルの表示域を使って クリックされたテーブルを表示する 2)4テーブル表示域とは別の領域に4テーブルそれぞれの表示域がある プレースフォルダの使い方だけのような気がしますが 不明な部分の具体的な部分って何でしょう
お礼
間違えていました。 >プロパティを遷移元ページに設定しない場合はサンプルでいう→sqlCommand comm = new SqlCommand("SELECT isbn,title,publish FROM books ORDER BY published DESC", db);をご教示頂いたソースでコントロールすると言う事でしょうか? VBで作成しているのでDim comm As New SqlCommand("SELECT isbn,title,publish FROM books ORDER BY published DESC", db) の部分でした。
補足
ありがとうございます! 4つのテーブルの表示に関してはredfox63のおっしゃる通りです。 お恥ずかしいお話ですがASP.NETをまだ理解できていないのでどこをどうゆう風に触ればいいのかがはっきり見えていないのが現状です。。。 ("SELECT isbn,title,publish FROM books ORDER BY published DESC", db);をご教示頂いたソースでコントロールするといるのはわかるのですがそれをIF文でコントロールするのかどうかという不明な範囲は大きい感じです。 PlaceHolderコントロールもの使い方も理解できていないので・・・ すみません。 宜しくお願い致します。
お礼
すみません。。。 プロパティを遷移元ページに設定しない場合はサンプルでいう→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さん ありがとうございます! ちょっと難しい感じがしてしまいました。。。 月曜日がんばって試してみます。 またご質問させて頂くと思いますが宜しくお願い致します。