none
System.Web.UI.HtmlControls.HtmlForm.Controls.Add() メソッドで追加したSystem.Web.UI.WebControls.Button をクリックしたときのイベントの登録について RRS feed

  • 質問

  • 始めまして。
    VB.NETでaspxを作成しています。

    動的にSystem.Web.UI.HtmlControls.HtmlForm.Controls.Add() メソッドで追加したボタンコントロールをクリックしたときのイベントの登録の際に

                Dim l_objButton = New System.Web.UI.WebControls.Button
                l_objButton.ID = "BT_Push"
                l_objButton.Width = 500
                l_objButton.Text = "このボタンをクリック"
                l_objButton.Attributes.Add("AutoPostBack", "True")
                l_objButton.Attributes.Add("runat", "server")
                l_objButton.Attributes.Add("OnClick","DoIt")
                Form1.Controls.Add(l_objButton)

    このように登録すると、自分で作成しているメソッド「DoIt」が、呼び出せません。
    (”DoIt”は宣言されていません。 と出てしまいます。)

    どうもJavaScriptで関数を作らないといけないような動き(エラーメッセージそのものがスクリプトエラーで出てきます)をしているのですが、「<asp:Button・・・・」と固定でボタンコントロールを作成した時のように、VB側で作成しているプロシージャをOnClickイベントで呼び出すには、どのようにすればよろしいのでしょうか?

    お手数ですが、ご存じの方いらっしゃいましたら、ご教示願います。
    (VB.NETもWebアプリも始めたばかりで・・・質問の内容がおかしいところ等がありましたらすみません・・・)

    2012年8月1日 12:14

回答

  • 失礼な言い方を承知で言わせていただければ、基本的な知識が
    かなり足りないと思います。

    DoIt はサーバー側で動く VB.NET のメソッドのようですが、そ
    うであれば以下のようなコードはあり得ません。

    > l_objButton.Attributes.Add("OnClick","DoIt")

    「vb.net」「イベントハンドラ」「追加」をキーワードにググ
    って調べると参考になるページが見つかると思います。

    その他、以下のコードも変です。

    > l_objButton.Attributes.Add("AutoPostBack", "True")
    > l_objButton.Attributes.Add("runat", "server")

    本を買って読むなどして、基本的な知識をつけることをお勧め
    します。

    • 回答としてマーク どらちん 2012年8月2日 1:50
    2012年8月1日 13:13

すべての返信

  • 失礼な言い方を承知で言わせていただければ、基本的な知識が
    かなり足りないと思います。

    DoIt はサーバー側で動く VB.NET のメソッドのようですが、そ
    うであれば以下のようなコードはあり得ません。

    > l_objButton.Attributes.Add("OnClick","DoIt")

    「vb.net」「イベントハンドラ」「追加」をキーワードにググ
    って調べると参考になるページが見つかると思います。

    その他、以下のコードも変です。

    > l_objButton.Attributes.Add("AutoPostBack", "True")
    > l_objButton.Attributes.Add("runat", "server")

    本を買って読むなどして、基本的な知識をつけることをお勧め
    します。

    • 回答としてマーク どらちん 2012年8月2日 1:50
    2012年8月1日 13:13
  • まず、ASP.NETでプログラムを作成する際の基本的な手順を学習してください。
    それこそHalloWorldレベルのプログラムを作ってみてください。
    そしてそれがどのように動いているか、できればHTTPのレベル(ブラウザからのリクエストとそれに対するサーバーの返信)で解析してみてください。

    ASP.NETはサーバー側で処理を行なってHTMLを生成し、リクエストをあげてきたブラウザに返します。
    このあたり、Windowsアプリの経験は「まったく」役にたちません。
    記述されたプログラムをみると、今までのVBでのWindowsアプリの経験がむしろ邪魔になっていると思われます。

    WebFormはいろいろと裏側で動く仕組みを用意して、できるだけWindowsアプリと似たようにプログラムを記述できるようにしてはいますが、根本的な動作原理が異なりますので、似せるにしても限度があります。
    まず、WindowsアプリとWebアプリは原理が違う、だからプログラムの記述方法も違ってくる、というのを前提に学習をすすめないとこの先ハマるばかりだと思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    2012年8月2日 1:37
  • SurferOnWwwさん、レスありがとうございます。

    おっしゃる通りで、2か月くらい前にHelloWorldから・・・。
    8月までに「とりあえず動くものを作れ」との業務命令で基礎をほとんどすっ飛ばしてググったり、人に教えてもらいながら無理やり作っている状態です^^;
    (VBもほぼ初体験状態で・・・C言語、C++でバイナリアプリしか作ったことがなくて・・・不勉強ですみません。なぜ開発チームでもない私にこのような仕事が回ってきたのかも謎ですw と、愚痴ってもしょうがないですね、失礼しました^^)

    >その他、以下のコードも変です。

    >> l_objButton.Attributes.Add("AutoPostBack", "True")
    >> l_objButton.Attributes.Add("runat", "server")

    確かにそうみたいですね・・・これだと作成されたWebページ側のHTMLソースに内を見ると<Input・・・タグの中に入ってしまうんですね>_<
    (Styleなどをこれで入力して変わったので、「<asp:xxxx・・・」 のタグの中身はすべて同じように入れていけばいいものと勘違いしていました・・・orz)
    ありがとうございます。

    イベントハンドらの追加方法はわかりました!

    AddHandler CType(Form1.FindControl("BT_Push"), System.Web.UI.WebControls.Button).Click, AddressOf DoIt

    で行けました!!
    「l_objButton.Attributes.Add("・・・」の部分は、もう少し調べてみます。
    本当にありがとうございました^^

    2012年8月2日 1:50
  • 小野@どっとねっとふぁん さん、レスありがとうございます。

    ASP.NETはおろか、VB.NETやWeb開発すらまともにやったことなかった有様で・・・
    VC++でWin32 SDKをゴリゴリ動かすような事しかやったことがないので、わからないことや混乱することが多いです>_<
    「Win32アプリだとこんなこと簡単にできるのにな~」と思う事ばかり(ASP.NETに慣れていらっしゃる方は逆なのかもしれませんが)ですね。

    チーム内でのみ使うツールなのでとりあえず動く状態で締め切りを切られて作れ!という上司の絶対命令には逆らえず、この有様です>_<
    社内に開発チームは別にいるんですけどねぇ・・・と、また愚痴ってしまいました>_<

    年明けに、ゆっくりと機能追加・改修ができるようなので、その時までにじっくり勉強し、改修時にきれいに直していきたいと思います。
    本当に、ありがとうございました。

    2012年8月2日 2:03
  • > AddHandler CType(Form1.FindControl("BT_Push"),
    > System.Web.UI.WebControls.Button).Click, AddressOf DoIt
    >
    > で行けました!!

    わざわざ Form1 の中から BT_Push を探さなくても、

    Dim l_objButton = New System.Web.UI.WebControls.Button

    から

    Form1.Controls.Add(l_objButton)

    までの間に、

    AddHandler l_objButton.Click, AddressOf DoIt

    というコードを入れたらうまくいきませんか?

    2012年8月3日 12:48
  • SurferOnWwwさん

    おっしゃる通りですね、ありがとうございます!!
    なんでわざわざこんな面倒な作り方していたんでしょうねw

    本当にありがとうございました^^

    2012年8月6日 3:18