ASP.Net初心者の難解な壁に当たっております

このQ&Aのポイント
  • ASP.Net初心者がグリッドビューの内容を変更する方法がわからない
  • TableAdapterやDataTable、Classを記述してもIntelliSenseに関数名が表示されず呼び出せない
  • GetMstTokDataSet2メソッドが宣言されておらず呼び出せない
回答を見る
  • ベストアンサー

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 -------------------------------------------------------------------

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

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

あのねえ。 貴方、クルマの運転するのに、「キーを回したのに動きません。何で」と言ってるのと同じだよ。 クルマなら順番にガソリンの入れ方、ドアの開け方、ギアの入れ方っちゅうもんがあるんでないの? カスタマイズしたWhere文を動的にセットするために、GridViewにSQLDataSource繋いで、TableAdapterも理解しないところから始まってるのに、その過程で「自分の質問の意図と違う」とは何ぞ。 ObjctDataSourceってカスタマイズしたSQLの処理に限らず、ページング表示とか、更新・削除・挿入などの双方向処理などを行うための奥深い、複雑なものなんだ。 先に接続先であるDAOのことを完全に理解しないと手が出ないと思ってそういう説明をしてる。 「初心者や」ていうんなら、「ここまではわかった」という過程を明確にして進まんといかんよ。 まあ、色々やってみることやね。 オイラの言ってることは赤間本にも、ネットにも山のように書いてあるし。

kyokotan12
質問者

お礼

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

その他の回答 (1)

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

何か変だなあ。。 Protected Sub Button1_Click というボタンが何をするものかよくわからないのですが、単にGridViewとObjectDataSourceを連結するだけなら、 me.theGridViewXXXXControl.DataBind() だけですよ? で、以降はGridViewのPagingコントローラが、勝手にObjectDataSourceを呼び出して、自らの表示を行い、クリックされればObjectDataSourceを呼び出してページング表示を行います。 何度も繰り返しますが、ObjectDataSourceって、データソース(この場合はTableAdapter)と、コントロール(GridView)を媒介するだけです。 早い話、プロパティ設定パネルでSELECT/DELETE/UPDATE/StartIndexなどの属性に対応するTableAdapterのメソッドやプロパティを設定してするだけです。 GridViewのDataSource(DataSourceIDではなく)に、TableAdapterの戻り値を突っ込み、DataBind()してもデータは表示されます。 それなら何でこんなもんを使うかというと、ページング表示やデータ更新。削除において、表示コントロールとデータアクセス側(TableAdapterやDataAdapter)を仮想化して繋ぎたいからなのです。 DAO(データアクセスオブジェクト)は、DB以外にも各種のストリーム、XML、RSSなど色々あるので、こいつ(ObjectDataSource)がはまっていると、泥臭い物理取得を切り離せるので、都合がいいのです。 //== とにかく、TableAdapterとObjectDataSourceと、GridViewの話がごっちゃになっています。 この3つを分けて順にマスターしていきましょう。 //== DataSet1というデータセットを作成し、中にAccessesというデータテーブルと、AccessesTaというテーブルアダプタを作ったときの例文。C#ですいません。適宜VBに読み替えてください。 namespace TableAdapterSample.DataSet1TableAdapters {  public partial class AccessesTa // クラス拡張宣言  {   // データハンドリング属性はべつになくてもいいので省略   public DataSet1.AccessesDataTable GetData_bySQL(string sqlWhere) {    this.Adapter.SelectCommand = this.CommandCollection[0]; // テーブルアダプタ[0]番目のSELECTを取得    this.Adapter.SelectCommand.CommandText += " " + sqlWhere; // 後ろにWHERE文を追加    var dt = new DataSet1.AccessesDataTable(); // 入れ物(型づきデータテーブル)を準備    this.Adapter.Fill(dt); // 充填    return dt;   }  } // of class } // of namespace this.Adapterてのは、TableAdapterが内包しているDataAdapterのことですわ。

kyokotan12
質問者

補足

shockatzさん お世話になります。 グリッドビューのデータの変更をするときのタイミングとして ボタンコントロールがあり、ボタンが押された時に処理を行い、メソッドを実行したいというのが質問なのです。 shockatzさんのご説明だと、条件となるコントロールが変更される度にグリッドビューが変更されていく感じなのでしょうか? 引数の作成もボタンコントロールで行いたいのですが・・・ 私が根本から勘違いしてますでしょうか? 複雑な動的Where句 であるSQL文を自身で作成し、DataTableのデータソースにしたい、そのトリガーをボタンにしたいという感じなのですが・・・ 何か考え方が間違ってますでしょうか? なにぶんAsp.Net初心者なので、変な質問をしてるでしょうか

関連するQ&A

  • 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 -----------------------------------------------------------------------------------

  • 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 ----------------------------------------------------------------------------------

  • フォームとその上にあるMSFlexグリッドのハードコピー方法

    フォームとそのフォーム上にあるMSFlexグリッドの ハードコピーを、やはりそのフォーム上に設けたコマンド ボタンのクリック一発で行えるようにしたいのです。 下記の構文で、PrintFormメソッドを使ってやってみましたが、 MSFlexグリッドの部分が真っ黒に印刷されてしまいます。 With Printer .PaperSize = vbPRPSA4 .Orientation = vbPRORLandscape End With Form_Ichiran.PrintForm   どなたかご存知の方、よろしくお願いします。

  • クラスの記述を別ファイルに・・・

    VS2005でASP.NET Webサイトの開発を行っています。 新規作成時に生成される"Default.aspx.vb"に以下のようなコードを記述しました。 1 : Imports System 2 : 3 : Partial Class _Default 4 : Inherits System.Web.UI.Page 5 : 6 : Dim objX = New Space1.Class1 7 : 8 : Dim X = objX.method1(10, 2) 9 : 10 : Dim Y = objX.method2(10, 2) 11 : 12 : End Class 13 : 14 : Namespace Space1 15 : Class Class1 16 : Public Function Method1(ByVal X1 As Integer, ByVal X2 As Integer) As Integer 17 : Dim X3 As Integer 18 : X3 = X1 + X2 19 : Return X3 20 : End Function 21 : 22 : Public Function Method2(ByVal Y1 As Integer, ByVal Y2 As Integer) As Integer 23 : Dim Y3 As Integer 24 : 25 : Y3 = Y1 - Y2 26 : Return Y3 27 : End Function 28 : End Class 29 : End Namespace そこで、15行目以降にある"Class1"なのですが、 よく使用するクラスなので、15~29行目のコードを別のファイルに 記述したいと思っています。(例えば"AAA.vb"とかに) しかし、15~29行目を別ファイル(AAA.vb)に記述した途端、 "Default.aspx.vb"の6行目でSpace1.Class1が宣言されてない。 というエラーが生じます。 このようにクラスの記述部を別ファイルにした場合、 Default.aspx.vbでうまくインクルード(レガシーASPの言い方ですが) させるには、 どうすればよろしいのでしょうか?

  • 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

  • フォームのデータシートビューにてVBAで直接記述したSQL文を実行した結果を返すことは不可能でしょうか?

    リストボックス、コンボボックスなら Private Sub Form_Open(Cancel As Integer) With Form_フォーム1.リスト2 .RowSourceType = "Table/Query" .RowSource = "SELECT テーブル.フィールド, FROM テーブル" End With End Sub で結果を返すことは可能なのですが フォームをデータシートとして Private Sub Form_Load() Me.RowSourceType = "Table/Query" Me.RowSource = "SELECT テーブル.フィールド, FROM テーブル" End Sub とするのは不可能ですか? これを実行すると 「コンパイルエラー メソッドまたはメンバーが見つかりません」 となり、 「RowSourceType =」が選択されます。 そしてVBAの停止の意の四角ボタンを押すとユーザーフォームが図のようになります。 私のやりたいことは、クエリではなくVBAでSQL文を書き、データシートビューで表示させたいのですがやはり不可能でしょうか? (変数を代入できるため) 何でもいいのでご教授よろしくお願いします。

  • ASPからファイルダウンロード

    Win2k+IISでASPプログラムを組んでいます。 A.aspのページでボタンを押すとA.aspないのDownLoad関数実行してファイルをダウンロードするプログラムです。 一回目はうまくダウンロードできますが,それが終わった後A.asp内のボタンを押してもダウンロードが出来ません。 これはなぜでしょうか。 (1)怪しいと思うところはA.aspページで全て処理しているからかな~と思います。 A.asp function download() Response.AddHeader "Content- Disposition","attachment;filename=aa.csv" Response.ContentType = "application/octet-stream" Response.Write( "AAAAaaa" & "," ) Response.Write( "BBBaaa" & "," ) Response.End() End function

  • vb.net Charsメソッドについて

    vs2008、.NET Framework 3.5 にてvb.net の勉強をしているのですが、 下記のような場合にビルドエラーにならないことについて 疑問があります。 Public Class ClassA   Private Sub methodA()     Dim a As String = getString(1) ・・・★   End Sub   Private Function getString() As String     Return "abcdefg"   End Function End ClassA getStringメソッドには引数をとらないもののみが定義 されているので、methodAからgetStringメソッドを呼び出した 場合(★)は、ビルドエラーになると思うのですが、なりません。 a の値は"b"になります。 調べてみたところ、引数に1を設定したことによって、 Charsというメソッドが呼ばれているようなのですが、 それであれば、 Dim a As String = getString().Chars(1) と書くものだと思うのですが…。 こういう書き方もできるんだという話であればそれまでなのですが、 どうも腑に落ちないので、説明できる方がいらっしゃれば 教えていただきたいです。

  • ASP.NetでJavaScriptからポストバックしたい

    ASP.NetでJavaScriptからポストバックしたいです。 以前のASPでは、以下の文法でOKでした。 function DblClick() { form1.method = "post"; form1.action = "test.asp"; //自分自身 form1.submit; } しかし、ASP.Netでは同じように記述しても何も起こりません。(無視される?) 表記方法が変わってしまったのでしょうか。。。

  • ASP.NET サーバーでClassのコードが動かない

    ASP.NET2.0で開発を行っています。 以下のようなコードをネットから見つけてきたので、それを元に開発を行おうと思っていたのですが、ローカルでは正常に動作するのに、サーバーに移行させたとたん、エラーになりました。 --------------------- [class1.vb] Public Class Class1   Public Function viewip()     Return System.Web.HttpContext.Current.Request.UserHostAddress   End Function End Class [WebForm1.aspx.vb] Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load   '--Class1のインスタンスを生成   Dim o_class As New Class1     '--IPアドレスを取得し表示   Dim s_ip As String = o_class.viewip()   Response.Write(s_ip) End Sub ------------------------------- エラーの内容は、下記の通りです。 おそらくClass1が見つからないのだろうとは思うのですが、 どこを修正すればよいか分からず困っています。 どなたかご教授願えないでしょうか?? ------------------------------- Compiler Error Message: BC30002: Type 'Class1' is not defined. -------------------------------

専門家に質問してみよう