ASP.Net初心者がグリッドビューのデータソースに動的Where句を使用したい

このQ&Aのポイント
  • ASP.Net初心者が、グリッドビューのデータソースに動的Where句を使用する方法がわかりません。
  • ボタンクリックイベントのプログラムで、SQL文を作成し、TableAdapterのメソッドを実行することで、グリッドビューのデータを更新したいです。
  • まだ理解が足りないため、初心者なので、助言をお願いできればと思います。
回答を見る
  • ベストアンサー

ASP.Net ObjectDataSource4

お世話になります。 ASP.Net 初心者です。日夜修行をしているのですが、難解な壁に当たっております。 グリッドビューのデータソースに 動的Where句を使用したい質問を以前にいつかさせていただいております。 そこで下記のようなプログラムをお教えいただきました。 テストとしまして、Webフォームには 本題のグリッドビュー、リストボックス、ボタンが配置しております。テストですので、リストボックスを選択後にボタンを押すと、ボタンクリックイベントにて、Where句を を作成し、下記のメソッドの引数である SQL に入れてメソッドを実行し、グリッドビューのデータを更新したいのですが、ボタンをクリックした際に、どのようにしてグリッドビューのObjectDataSourceの中にあるTableAdapterのメソッドを引き数とともに実行すればよいのか未だにわかりません。 (1)ボタンコントロールを押す、コードでSQL文を作成 (2)下記のTableAdapterのメソッドを(1)で作成した引数とともに実行 (3)グリッドビューのデータが更新される 上記のプロセスをボタンクリックイベントのプログラムでどうやって実現させればよいかがわかりません。 Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click     Where 以下のSQL文を作成する     ●(ここがわからない)作成したSQL文を引き数にTableAdapterのメソッドを実行     グリッドビューが更新される End Sub 上記のようにボタンクリックイベントで実行したいのです。 普通はこういうやり方でやらないのでしょうか? なにぶん初心者なので、今しばらくおつきあいいただき、ご教授していただけますと 大変助かる次第でございます。 何卒よろしくお願いいたします。 ----------------------------------------------------------------------------------- Namespace MstTokDataSetTableAdapters   Partial Public Class t_MstTokTableAdapter     <DataObjectMethod(DataObjectMethodType.Select, False)> _     Public Function GetMstTokDataSet2(ByVal SQL As String) As DataTable       Adapter.SelectCommand = CommandCollection(0)       Adapter.SelectCommand.CommandText += " " + SQL       Dim Dt As DataTable = New MstTokDataSet.t_MstTokDataTable()       Adapter.Fill(Dt)       Return Dt     End Function   End Class End Namespace -----------------------------------------------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • shockatz
  • ベストアンサー率80% (153/191)
回答No.2

とりあえずObjectDataSource抜きで接続はできたの? そもそも、 Public Function GetMstTokDataSet2(ByVal SQL As String) As DataTable ぢゃ駄目だよ。 正しくTableAdapterが作られていれば、ここは、 Public Function GetMstTokDataSet2(ByVal SQL As String) As t_MstTokDataTable になるはず。DAO側の戻り値は「強い型付き」でないと。ObjectDataSourceはデータソースのプロパティでハンドリングを行うから、「型なし」のDataTableではうまくない。 ページング表示や、一覧形式での更新をしなくていいのなら、こんな感じで「強い型付き」のDataTableを撮ってきて、直接ビューコントロールのDataSourceに入れてやればいい。ObjectDataSourceは不要です。 //== ObjectDataSourceへのパラメタ渡しについては(ObjectDataSourceをどうやって作っているかそもそも??なのだが)、ObjectDataSource側にSelectParametersって属性を設定できるでしょ? ウィザードで設定すると、こういうタグができているはず。 <SelectParameters> <asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue" Name="EmpID" Type="Int32" DefaultValue="0" /> </SelectParameters> 見たとおりだわ。この例だと、ObjectDataSourceは、"EmployeesDropDownList"の"SelectedValue"を見てて、それを"EmpID"という引数に埋めてDAOを呼び出す。型はInt32で、デフォルト値は0。 だから、なんとかボタンのClickイベントでは、 グリッドビュー.DataBind() だけで済んでしまうのですよ。 DataBind()の瞬間に、グリッドビューのDataSOurceIDに指定されているObjectDataSourceが呼ばれ、ObjectDataSourceは勝手に"EmployeesDropDownList"の"SelectedValue"を呼びにいって、その値引数"EmpID"というプロパティでDAOを呼び出し、取得したなんちゃらDataTableをグリッドビューに返し、グリッドビューがそれを表示する。 ObjectDataSourceを使うと、「全部宣言で用意しておいて」、取得も更新も削除も自動的に行うわけ。 SqlDataSourceと同じことだわ。 //== あとついでに蛇足 何かグリッドビューの表示時に、いろいろ表示をTweakしたいみたいだけど、それをやるならグリッドビューはNGだよ。 一覧表示のGridView、個別表示のDetailsViewというのが、よくセットで使われる第2世代のデータビューコントロールだけど、そもそも表示をカスタマイズしたり、生成されるタグを完全制御できない。 勝手にテーブルになるし、グリッドの形式も制御不能。 要するにGridView/DetailsViewてのは、「第二世代お手軽データビューコントロール」っす。 まあ、簡単な表示ができるようになったら、とっととListViewに鞍替えしたほうがいいよ。 ついでに、詳細画面を作る際もFormViewを使うべし。

kyokotan12
質問者

お礼

shockatz様、大変お世話になっております。 最新の質問までいろいろとご指導ありがとうございます。 ObjectDataSource とDBの接続方法、動的SQL文の設定、 そのほか、いろいろな接続、変更などの方法の仕方が未熟ゆえ わからない次第でございます。 まだグリッドビューの動的SQLの変更方法など、まだわたくしには早かったかなと質問の回答を見させていただき思って次第でございます。 まずは ご紹介いただいた、赤間本を読破、熟読し、グリッドビュー、リストビューの選定など、改めてご質問させて下さいませ。 その際には初心者にもわかるご回答お待ち申し上げております。 ありがとうございました。

その他の回答 (1)

noname#259269
noname#259269
回答No.1

過去の質問を拝見しましたが、基礎知識をもう少し仕入れるべきです。 でないと何時までも質問しないと前に進めませんよ。 まずは、クラス・インスタンスについて学習しましょう。 クラスメソッドは、 クラス名.メソッド名 で呼び出します。インスタンスメソッドは、 オブジェクトを作って オブジェクト名.メソッド名 で呼び出します。 今回は敢えて ObjectDataSource には突っ込まずに GetMstTokDataSet2 を呼び出す事だけを回答してみます。 Dim sql As String = "SELECT ~" Dim t As New MstTokDataSetTableAdapters.t_MstTokDataSetTableAdapters() Dim dt As MstTokDataSet.t_MstTokDataTable = t.GetMstTokDataSet2(sql)

kyokotan12
質問者

補足

edp3142さん 大変お世話になります。 クラス、インスタンスについての勉強しっかりとやろうと思います。 ご指摘ありがとうございます。 Dim TN As New MstTokDataSetTableAdapters.t_MstTokTableAdapter() Dim dt As MstTokDataSet.t_MstTokDataTable = TN.GetMstTokDataSet2(SQL) これで GetMstTokDataSet2  が呼び出されることしっかり勉強させていただきました。この事を忘れずに精進したいと思っております。 ですが、グリッドビューのソースは変わりません。 グリッドビューのソースはこれだけではデータが反映されないのですね。 ここからObjectDataSourceを操作しデータを反映させる感じになるのでしょうか? 差支えがなければ、この記述の後にどう書けばグリッドビューが更新されるのか、お教えいただけますと大変助かるのですが・・・ 何卒よろしくお願い申し上げます。

関連するQ&A

  • ASP.Net ObjectDataSource3

    ASP.Net ObjectDataSource2 お世話になります。 ASP.Net 初心者です。日夜修行をしているのですが、難解な壁に当たっております。 DataObjectSource に下記のメソッドを追加しました。 グリッドビューを配置してあるWebフォームがあり、 そこにあるDataObjectSourceのSELECTのメソッドを下記のモノに変更しました。 フォームにボタンを追加し、このボタンを押すと、下記が実行されグリッドビューの内容が変更されるようにしたいのですが、どうしても下記のメソッドを呼び出せないのです。 そのまま Call GetMstTokDataSet2(SQL) と呼び出しても 'GetMstTokDataSet2' は宣言されていません。アクセスできない保護レベルになっています。 と表示されてしまいます。 TableAdapter や、DataTable、Class などを初めに記述して、IntelliSense にてその次の候補に関数名が出るわけでもなく、ボタンの  Protected Sub Button1_Click から下記のメソッドをどう呼び出してよいのかがわかりません。 本当に基本的な事だと思うのですが、本当にわからないのです。 何卒よろしくお願いいたします。 (App_Code¥MstTok_ODS.vb に記述してあります) (MstTokDataSet.xsd) ------------------------------------------------------------------- Namespace MstTokDataSetTableAdapters   Partial Public Class t_MstTokTableAdapter     ’問題のメソッド     <DataObjectMethod(DataObjectMethodType.Select, False)> _     Public Function GetMstTokDataSet2(ByVal SQL As String) As DataSet       プログラムが記述してあります。     End Function   End Class End Namespace -------------------------------------------------------------------

  • ASP.Net ObjectDataSource2

    お世話になります。 ASP.Net 初心者です。日夜修行をしているのですが、難解な壁に当たっております。 ASP.Net にてObjectDataSourceを作成し、 グリッドビューの動的なWhere句に対応させるべく 自分なりに、例題のプログラムを変形させて以下のようにさせました。 引数のSQLには 完成されたSQL文が入っております。 ObjectDataSource には MstTokDataSet.xsd を作成 その際にできたアダプターが t_MstTokTableAdapter になります。 一番簡単なプログラムを書き、動作するところまでいけば、あとは応用かなと思うのですが、 下記をデバックすると Return Comm.ExecuteReader(CommandBehavior.CloseConnection) 一番最後のこの部分で、下記のエラー表示されてしまいます。 エラー 1 型 'System.Data.Common.DbDataReader' の値を 'System.Data.DataSet' に変換できません。 まずは自分で記述したSQL文を引数に入れて、下記をボタンコントロールから実行してグリッドビューの内容を変更したいのですが、なかなかうまくいかないですね! (1)下記のプログラムの何が問題なのか? (2)考え方は正しいのか? とんちんかんな事をしてないでしょうか? (3)ボタンコントロールからこのメソッドを呼び出すにはどのようにすればよろしいのでしょうか? 上記(1)、(2)、(3)をご教授いただけますと大変助かります。 何卒よろしくお願い申し上げます。 ---------------------------------------------------------------------------------- Imports Microsoft.VisualBasic Imports System.ComponentModel Imports System.Data Imports System.Data.Common Imports System.Data.SqlClient Namespace MstTokDataSetTableAdapters Partial Public Class t_MstTokTableAdapter <DataObjectMethod(DataObjectMethodType.Select, False)> _ Public Function GetMstTokDataSet(ByVal SQL As String) As DataSet Dim Setting As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("connectionString") Dim Factory As DbProviderFactory = DbProviderFactories.GetFactory(Setting.ProviderName) Dim DB As DbConnection = Factory.CreateConnection() DB.ConnectionString = Setting.ConnectionString Dim Comm As DbCommand = Factory.CreateCommand() Comm.Connection = DB Comm.CommandText = SQL DB.Open() Return Comm.ExecuteReader(CommandBehavior.CloseConnection)      ここでエラーになってしまいます。例題どおりやってるのですが・・・ End Function End Class End Namespace ----------------------------------------------------------------------------------

  • 【ASP.net】SqlDataSourceについて

    【ASP.net】SqlDataSourceについて index.aspxページにSqlDataSource1とGridView1と検索ボタンをセットし、 検索ボタンが押されると、SqlDataSource1にセットしているSQLにWHERE文を 追記して、GridView1を再表示させたいのですが、どのようにすれば良いのでしょうか? 現在のソースです・・・。 Dim Str As String = SqlDataSource1.SelectCommand Dim StrSql As String = "" StrSql = " WHERE lbl = ららら " Str = Str & StrSql SqlDataSource1.SelectCommand = Str GridView1.DataSource = SqlDataSource1.SelectCommand GridView1.DataBind() この状態だと、SQL文がBindされてしまい、DBから値がとれません。 解る方いらっしゃいましたらご教授お願いします。

  • ASP.Net ObjectDataSource

    現在、過去にAccess で作成しましたシステムをASP.Net にて作り変えております。 GridView のデータソースとして 動的なWhere文を必要としていることから 以前、SQLDataSourceよりもObjectDataSourceに変更したほうが良いとのアドバイスをいただき、赤間本と呼ばれる構築技法の書籍も購入しまして日夜勉強しているASP.Net初心者の者であります。 こちらの本の第10章からが動的Where文を紹介している部分だと思うのですが、なかなか難解で頭に入ってきません。 【こちらでやった事】 DataSetを作成し、基本SQLを作り、TableAdapter を作成しました。 【まずわからない事】 例えば Where句が全て埋まっている場合のSQLが下記のものだとします。 SELECT * FROM test WHRE A = @para1 AND B = @para2 AND C = @para3 動的SQL文を作成したいので SELECT * FROM test WHRE A = @para1 だったり SELECT * FROM test WHRE B = @para2 だったり SELECT * FROM test WHRE C = @para3 だったり SELECT * FROM test WHRE A = @para1 AND B = @para2 だったり SELECT * FROM test WHRE B = @para2 AND C = @para3 だったり SELECT * FROM test WHRE A = @para1 AND C = @para3 だったり SELECT * FROM test WHRE A = @para1 AND B = @para2 AND C = @para3 だったりと 全部で7通りあるわけです。 書籍には、クエリを追加するようにと記述されているのですが、 これら7通りを全て記述して クエリの条件にあったモノを選択し、実行させ GridView にバインドさせるのでしょうか? もしそうだとすると パラメーターが仮に10個あったとしたら すごい数のクエリを追加していくことになるのかなと思い、 まずは、どういう概念で登録していくのかをお教えいただければと存じます。 今まで、動的SQL の場合は、パラメーターが空白、NULLの場合にはSQL文に含めない形で SQL文を作成し、レコードソースにしていたのでTableAdapter を作成して どのような形で動的クエリを実行させるのかがまったくつかめていない状況でございます。 なんとかこの壁を突破し前へ進めればと思っております。 よろしくお願い申し上げます。

  • 列名が無効とエラーが出ます。

    SQLServe2000でビューを作成していて困っています。 問題のSQL文は SELECT k.hiduke, year(k.hiduke) as segyear, month(k.hiduke) as segmonth from dbo.S_View_kado2 as k where segmonth=1 上記SQLを実行すると 列名'segmonth'は無効です とエラーが発生します。where文を削除するとエラーは出ません。 where文を where segyear=2009 としてもエラーは起きません。 原因が判らず困っています。 ご回答頂けると幸いです。宜しくお願いいたします。

  • ASP.Net ODS UpDateメソッド

    お世話になります。 ASP.Net 初心者です。日夜修行をしているのですが、難解な壁に当たっております。 GridView にデータソースとして ObjectDataSource を指定しております。 GridView でどうしても インラインエディットをしたい個所が2カ所あるのです。 赤間本では、インラインエディットはいろいろな事から使用しないほうが良いとのこのなのですが、どうしても使用したいのです。ですが、GridViewの編集を有効にするにチェックをして、問題の2か所を変更しても、隠れているフィールドに対する値がないとエラーになってしまいます。 レコードにはユニークなIDキーがあるので、以下のようなUPDate用のメソッドを作成し、ObjectDataSource のデータソースの構成、メソッドの定義の UpDateのところでメソッドを選択したのですが、パラメータも以後聞かれないですし、これが正しいのかもわかれいません。 UpDateの時の戻り値、パラメータの設定など わからない事ばかりです。 GridView の編集ボタンを押して、2つの項目を変更し、更新を押したときの制御の時にこのメソッドをどう使ったらいいのかなど、何卒ご教授いただけますと大変ありがたいです。 もともとある UpDate のところを見るとパラメータと戻り値しか書いてないのですが、プログラムが記載されていれば、それを見て応用できるんですが・・・ 何卒よろしくお願いいたします。 <DataObjectMethod(DataObjectMethodType.Update, False)> _ Public Function UpDateNitteiSeekData(ByVal TEST1 As Nullable(Of Integer), ByVal TEST2 As Nullable(Of Integer), ByVal KeyID As Integer) As NitteiSeekDataSet.t_MasterDataTable Dim SQLDa As SqlDataAdapter Dim SQL As String SQL = " UPDATE dbo.t_Master SET TEST1 = " & TEST1 & " ,TEST2 = " & TEST2 & " WHERE(KeyID = " & KeyID & ")" 'このKeyID がユニークな主キーになります。      ’この辺りから怪しくなります。 UpDateの時は以下でいいのかな? SQLDa = New SqlDataAdapter(SQL, "Data Source=SERVER01;Initial Catalog=TEST;Integrated Security=True") Dim table As NitteiSeekDataSet.t_MasterDataTable = New NitteiSeekDataSet.t_MasterDataTable SQLDa.Fill(table)      '戻り値って table 型でいいの? Return table End Function

  • ASP.Net TextChangedイベント

    お世話になります。 TextChangedイベントの引数に関しまして教えて下さい。 A ・・・ ボタン B ・・・ テキストボックス Aボタンを押したときのイベントの中に、BのテキストボックスのTextChangedイベントも実行させたいのですが、 Protected Sub A_Click(sender As Object, e As System.EventArgs)     Dim A As Button = FormView1.Row().FindControl("A")     Call B_TextChanged( A , e As System.EventArgs)     Sender は Aボタンでいいと思うのですが、     e As System.EventArgs この部分の e にはどのようなモノを入れればいいでしょうか?     (EventArgs派生クラス) と書いてあるのですが、実際どのように記述すればいいのかわかりません。 End Sub 何卒よろしくお願いいたします。

  • CASE文での問い合わせ

    下記のSQLでWHEREでnow_tが存在しないとでてSQLを実行できません。 どのようにしたらnow_tをWHEREで判定できるでしょうか。 WHEREが先に実行される為に存在しないというエラーがでるのは わかるんですが、でないようになんとかできないでしょうか? SELECT CASE WHEN s = 1 THEN 1 ELSE 2 END AS now_t FROM test WHERE now_t = 1

  • 現在、ASP.NET(言語:VB.NET)にて、

    現在、ASP.NET(言語:VB.NET)にて、 データ参照、更新系のWebアプリケーションを自学しているものですが、 DAC(Data Access Componet)を利用してSQL Serverのデータを取得、更新する際、 コネクションの閉じ方が分からず困っています。 DACを使用しない場合は、 下記のようにSQLConnectionをUsing句で明示的に括り、 Closeさせることができますが、 DACを使用した場合はTableAdapterからSQLConnectionを取得できず、 同様の実装方法を採れません。 ------------------ Dim mySelectQuery As String = "SELECT * FROM Categories ORDER BY CategoryID" Dim myConnectString As String = "Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=mySQLServer" Dim myCommand As New SqlCommand(mySelectQuery) Using conn AS SqlConnection = New SqlConnection(myConnectString) myCommand.Connection =conn myCommand.CommandTimeout = 15 myCommand.CommandType = CommandType.Text myCommand.ExecuteNonQuery() End Using ------------------ 一方、DACを使用した場合は下記のように実装しております。 ------------------ Dim ta As New SystemError_OriginalTableAdapters.OriginalTableAdapter Dim dt As New SystemError_OriginalDataTable ta.FillBy(dt, id) ' テーブルアダプターのFillメソッドを呼び出すのみで、Closeしているかどうかがわからない。 ------------------ DACでは、Fillメソッド実行後に必ずSQLConnectionがCloseされることが 保証されているなら問題は無いのですが、 そうでない場合、テーブルアダプターからSQLConnectionを取得して、 明示的にCloseさせてやりたいと思っています。 DACを使用した場合のSQLConnectionの取得方法、 もしくはSQLConnectionのCloseの方法についてご教授願えないでしょうか? 以上、宜しくお願いします。

  • ASP.Net ObjectDataSource!

    お世話になります。 現在Access で作成されているアプリケーションをASP.Netに移植する為に日々精進しております。 GridView のデータソースを自由な感じでWhere条件にしたい事から、SQLDataSource から ObjectDataSource に切り替えた方が良いとのご指摘をうけ、現在作業を行っているのですが、問題が発生いたしました。 SQLDataSource ではSelectCommand に自作したSQL文を設定し、バインドすればGridView に反映できたのですが、 ObjectDataSource にはこのようなプロパティがないのですが、どのように設定すればよいのでしょうか? SQLDataSourceのように簡単には設定できず、特殊なやり方じゃないとダメなのでしょうか? なにぶんAsp.Netは初心者なので、何卒お願い申し上げます。