動的に追加したコントロールについて

このQ&Aのポイント
  • ASPをVBScriptで作成している際、DBから検索した結果に応じて動的にコントロールを追加しているが、それらのコントロールに対して属性変更を行いたい。しかし、現在の方法では「オブジェクトがありません」というエラーが発生してしまう。
  • 指定した方法では、追加されたコントロールをループして属性変更することができない。エラーの原因としては、コントロールを文字符号列として扱っているため、正しくオブジェクトを参照できずにいる。
  • コントロールを動的に追加した後、それらのコントロールに対して属性変更を行いたい場合は、コントロールを参照するためのオブジェクトを適切に作成する必要がある。コントロールが追加された際にオブジェクトを作成し、それをループ内で利用することで、属性変更が可能となる。
回答を見る
  • ベストアンサー

動的に追加したコントロールについて

ASPをVBScriptで作成しています。 DBから検索した結果により、動的にコントロールを追加しているのですが、 この追加されたコントロールをループなどさせながら動的に指定して、 属性を変更したりしたいのですが、どのようにすればいいのでしょうか? 以下のように指定しても「オブジェクトがありません」となってしまいます。 Dim objTest Dim iCnt For iCnt = 0 To X   Set objTest = "Control" & iCnt   objTest.bgcolor = "#000000" Next ご存知の方いましたら、ご教授願います。

  • urach
  • お礼率61% (32/52)

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

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.4

> クライアントサイドでの話です。 > 画面でのアクションによって動的なコントロールの属性を変更したいのです。 なるほど。 こういう場合は、Documentオブジェクト(又はそれに紐ついたコレクション)から、コントロールのオブジェクトを参照して操作します。 例えば、ID="Control1"のオブジェクトが1つしかないなら、 ------------------------------------------------------ <HTML><HEAD><TITLE>TEST</TITLE> <SCRIPT LANGUAGE=VBSCRIPT> Sub X() Dim objTest Set objTest = Document.getElementByID("Control1") objTest.style.backgroundColor=&H0& End Sub </SCRIPT> </HEAD> <BODY> <FORM> <INPUT TYPE=TEXT ID="Control1" > <INPUT TYPE=BUTTON onClick="X()"> </FORM> </BODY> </HTML> --------------------------------------------------------- こういうHTMLを生成すれば、IDが「Control1」のエレメントを操作できます。

urach
質問者

お礼

ありがとうございます!! まさにやりたかったのはそういうことです。 私の説明が下手で手間を取らせてしまい申し訳ありませんでした。 本当にありがとうございましたm(_ _)m

その他の回答 (4)

  • loop_dog
  • ベストアンサー率32% (14/43)
回答No.5

横槍ですが。。。 >Dim objTest とは、どんなコントロールですか? そのコントロールのインスタンスを作成していなければ、 >「オブジェクトがありません」 というのは当たり前のことですし、 (何かをSETしていれば、別ですが) そのコントロールに >.bgcolor という、プロパティーが無ければ、代入は無理だと思います。

urach
質問者

お礼

回答ありがとうございます。 No4の回答で解決しました。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.3

ASPなんですよね? クライアントサイドではなく、サーバサイドの話ですよね? サーバサイドの実行時に、コントロールは存在しませんよ。 クライアント(ブラウザ)に表示する際に始めてオブジェクトが作成されますから・・・ ASPは、基本的に「HTMLタグを生成する」のが仕事です。 HTMLタグを出力する時に属性として指定してください。 #動的ではなく、固定個数で表示する場合の指定方法と同じです。 出力の1部をループさせたりして変更してください。 例えば・・・ -------------------------------------------------------- <% Dim iCnt For iCnt = 0 To X %> <INPUT TYPE="TEXT" NAME="Control<%=iCnt%>" bgcolor = "#000000" > <% Next %> -------------------------------------------------------- とか・・・ それとも、ASP側でクライアントサイドのVBSCRIPTを出力しているのでしょうか?

urach
質問者

補足

説明不足ですいません。 クライアントサイドでの話です。 画面でのアクションによって動的なコントロールの属性を変更したいのです。 可能でしょか?

  • STICKY2006
  • ベストアンサー率29% (1536/5269)
回答No.2

忘れてた。。。 http://www2.jiu.ac.jp/~en/VBSdocs/83.htm VBScriptなので、ASPとまったく同じでやっては動きませんでしたね。。。 宣言方法が若干違うぐらいではありますが。。。

urach
質問者

補足

Set objTest CreateObject("Control" & iCnt) 上記のようにCreateObjectで動的に作成されたコントロールを指定しても 「ActiveXコンポーネントはオブジェクトを作成できません。:'コントロール名'」 というエラーとなってしまいます。 やりたい事は作成されたコントロールを動的に操作したいのです。 説明が下手で申し訳ありません。

  • STICKY2006
  • ベストアンサー率29% (1536/5269)
回答No.1

こんちは。 >>Dim objTest >>Dim iCnt これだと、変数の定義かな?? オブジェクトは、宣言しないと使えませんよ? といっても、何をどうしたいのかイマイチ分からないのでなんとも言い様がありませんが。。。。 とりあえず、参考サイトです。。。 http://www.site-cooler.com/kwl/asp/13.htm

関連するQ&A

  • ループで呼び出しながら、追加クエリでテーブルに追加

    IDをループで呼び出しながら、追加クエリでテーブルに追加したいのですが、 値が入りません。 エラーなく動くのですが、テーブルに値が入っていないのです。 何がたりないのでしょうか? ――――――――――――― Public Sub CYUSYUTU_SEIKYUID2() Dim CYUSYUTU_SEIKYUID As String Dim recCount As Long recCount = DCount("*", "作業用請求先ID") Dim ID As String Dim DB As DAO.Database Dim RS As DAO.Recordset Dim i As Integer Dim strSQL As String Set DB = CurrentDb Set RS = DB.OpenRecordset("作業用請求先ID") RS.MoveFirst Do Until RS.EOF RS.Edit For i = 1 To recCount CYUSYUTU_SEIKYUID = RS.Fields("請求先ID(13)").Value DoCmd.RunSQL _ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='& CYUSYUTU_SEIKYUID &';" Next i RS.Update RS.MoveNext Loop RS.Close: Set RS = Nothing DB.Close: Set DB = Nothing End Sub

  • VB6 動的追加コントロールの値変更

    お世話になります。VB6初心者です。 動的追加コントロールの値変更で困っています。 Form3にFrame1をコントロール配列で1つ置いています。 ループ処理でFrame1をループ分LOADし、そのフレームの上にチェックボックスを動的に追加していく処理をしています。この動的に追加したチェックボックスの値の変更ができません。 ちなみに値やキャプションの取得はできます。 どなたかご教授願います。 Private Sub Command1_Click() Dim CHKbox(4) As VB.CheckBox Dim i As Integer For i = 1 To 4 Load Form3.Frame1(i) With Form3.Frame1(i) .Top = Form3.Frame1(i - 1).Top + 450 .Visible = True .Caption = "フレーム" & i End With Set CHKbox(i) = Controls.Add("VB.Checkbox", "CHKbox" & i, Form3.Frame1(i)) With CHKbox(i) .Move 2000, 200, 1300, 180 .Visible = True .Caption = "チェック" & i End With Next MsgBox CHKbox(1).Value  `値の取得は可能ですが CHKbox(1).Value = True   `値の変更ができません End Sub

  • コントロールが配列かどうかを知るには?

    Visual Basic6.0(SP5)で伺いたいことがあります。 フォーム上の全てのオブジェクトを For Each文で取得しています。以下の様にです。 Dim Control As Object For Each Control In Form1.Controls If TypeOf Control Is Text Then End If Next Control このとき個々のControlがコントロール配列かどうかを知りたいのですが、どうすればよろしいでしょうか?フォーム上にはコントロール配列のオブジェクトも、コントロール配列ではないオブジェクトもあります。 Control.Indexの値を参照しようとしても、コントロール配列でない場合は 「配列ではないオブジェクトです」とエラーになります。 IsArray関数でもFalseになってしまいます。 何を行いたいかというと、そのControlがコントロール配列(Text1(0)とかText1(1)とか)かどうかを調べて、そのIndexをある関数の引数にしたいのです。全てコントロール配列だったら、Control.Indexで値を取得できるのですが。 よろしくお願いします。

  • アクセスVBAです

    Sub test() Dim DB As Database Dim T As TableDef Dim myTable As String myTable = "Table1" Set DB = OpenDatabase(CurrentProject.FullName) For Each T In DB.TableDefs If T.Name = myTable Then DoCmd.DeleteObject acTable, myTable Exit For End If Next DB.Close Set DB = Nothing End Sub これを実行しようとすると Dim DB As Database の部分で コンパイルエラー プロジェクトではなく、ユーザ定義型を指定してください。 と言うエラーになります。 Dim DB As Objectにすればエラーにならずに進みますが 何が原因なのでしょうか?

  • コントロールタイプを絞ってループしたい

    アクセスのフォーム上のコントロールをループする際に テキストボックスだけ絞ってループしたいのですが Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acTextBox Then End If Next ctl End Sub これだとテキストボックスの量が多くて、2秒くらいかかるのですが For Each ctl In Forms(myFormName).Controls この時点で、テキストボックスだけ絞る方法はありますか? For Each ctl In Forms(myFormName).ControlType(acTextBox) こうするとエラーになりました。 ご教授よろしくお願いします。

  • 実行時追加したコントロールの識別

    VB2008を使用しています。 プログラム実行中に追加したコントロールをどのように識別すればいいのかがわからなくて困っています。 例えば以下のようにすると、 itemsが1と2のコンボボックスが10個できますが、 すべてNewComboBoxという名前のコントロールのため、 最終的にそれぞれ1か2どちらを選択したかを知りたいときに、 10個のコントロールをどのように識別すればよいかわかりません。 Dim NewComboBox As ComboBox = New ComboBox() For i = 1 To 10 NewComboBox = New ComboBox() NewComboBox.Items.Add(1) NewComboBox.Items.Add(2) NewComboBox.Location = New Point(5, 5 + (24 * (i - 1))) Me.Controls.Add(NewComboBox) Next 説明が不明瞭であるかもしれませんが、 お分かりの方いらっしゃいましたら、ご回答願います。

  • OCX内のコントロール名の取得方法

    VB6で下記の記述で実行しようと思ったのですが OCX内のコントロール名を取得できませんでした。 Dim strBtnName as String Dim objBtnName as Object For Each objBtnName In me.controls if me.Name = strBtnName then objBtnName.Enable = True End If Next objBtnName コントロール名を取得できない時は 文字列をオブジェクト名へ変換してしたいと 思ってるのですが変換方法がわかりません。 もしそういうのAPIなどがあれば教えてください。よろしくお願いします。

  • SQLで 全項目を追加したい

    ACCESS97を使用しています。 SQLを使用して、データの全件削除、全件追加を実施したいのです。 追加元(テーブルA)の項目と、追加先(テーブルB)の項目は同じです。 削除の方は下記の内容で上手くいきましたが 追加は実施できませんでした。 追加の時、*アスタリスクを使用する方法などないのでしょうか? Private Sub コマンド0_Click() Dim SQLstr As String Dim DB As Database Dim RS As Recordset Set DB = CurrentDb() SQLstr = "DELETE FROM テーブルB" DB.Execute SQLstr Set DB = Nothing SQLstr = "" SQLstr = "INSERT INTO テーブルB(*) VALUE (テーブルA*)" Set DB = CurrentDb() DB.Execute SQLstr Set DB = Nothing End Sub

  • ASP上1画面に複数のテーブルからデータを取るには

    いつもお世話になっております。 ASPの1画面に、複数のプルダウンを設置して、 そのプルダウンの内容をDBから拾ってきたいと思ってます。 DBのサーバーはsqlserverです。 各テーブルは、項目が全く違うのでJOINは使えません。 ご存知でしたら、ご教授お願いします。 1つのDBを読み込む際は、以下のコードにておこなってます。 <%@ LANGUAGE="vbscript" CODEPAGE=65001 %> <% Session.CodePage=65001 %> <!--#include file="config.inc"--> <!--#include file="dblib.asp"--> <% ' データベース利用用変数 Dim Conn ' Connection オブジェクト Dim Rs ' レコードセットオブジェクト Dim SQL ' SQL 文格納用 ' データベース接続の確立 Set Conn = ConnectDB(DSN) ' 会社の一覧を取得 SQL = "Select 法人コード,会社コード,法人名称 From 法人マスタ ORDER BY 法人コード" Set Rs = ExecSql(Conn, SQL) %> どうぞよろしくお願いいたします。

  • コマンドバーのコントロールって全部で何個あるの?

    全部一覧にして書き出してみたいのですが エラーを無視してる為、最高いくつあるのかわかりません。 Sub tes() Dim myBar As CommandBar Dim myCmd As String Dim blYes As Boolean Dim i As Long myCmd = "test" For Each myBar In CommandBars If myBar.NameLocal = myCmd Then blYes = True '既にmyCmdがあるのなら削除する Application.CommandBars("test").Delete Exit For End If Next Set myBar = CommandBars.Add(Name:="test") On Error Resume Next For i = 1 To 2000 myBar.Controls.Add ID:=i Next i myBar.Visible = True Set myBar = Nothing End Sub

専門家に質問してみよう