4

現在、学生寮のプロジェクトを行っており、学生に関する検索戦略を実装する必要があります。ここでは、ユーザーが.aspxページの別のサーバーボタンをクリックしたときにボタンを動的に作成する必要があるため、作成する必要があります。新しく作成されたボタンのonclickイベントハンドラー。私が使用したコードスニペットは次のとおりです。

protected void btnsearchByName_Click(object sender, EventArgs e)
    {
        TextBox tbsearchByName = new TextBox();
        Button btnsearchName = new Button();
        tbsearchByName.Width = 250;
        tbsearchByName.ID = "tbsearchByName";
        tbsearchByName.Text = "Enter the full name of a student";
        btnsearchName.ID = "btnsearchName";
        btnsearchName.Text = "Search";
        btnsearchName.Click += new EventHandler(this.btnsearchName_Click);

        pnlsearchStudents.Controls.Add(tbsearchByName);
        pnlsearchStudents.Controls.Add(btnsearchName);
    }
     protected void btnsearchName_Click(object sender, EventArgs e)
    {
        lblsearch.Text = "btnsearchName_Click event fired in " + DateTime.Now.ToString();

    }

ここで、問題は新しく作成されたeventHandlerが起動されないことです。私はこのサイトを調べ、いくつかの質問と回答を調べ、ページのライフサイクルも調べました。動的ボタンはInitまたはPre_initにあるべきだと言われていますが、私の問題は、別のボタンがクリックされたときにボタンを作成する必要があることです。 、どうすればそれが可能ですか?

4

5 に答える 5

3

すべてのポストバックにボタンのクリックハンドラーを追加する必要があります。

ページの読み込み時に学生の検索パネルでボタンを探すか、ページのOnInit()メソッドを試して、作成時にハンドラーを追加することができます。

こちらもチェックしてください:

動的に追加されたASP.NETボタンクリックハンドラーは無視されます

そしてここに: イベントハンドラーを備えたasp.net動的ボタン

そしてここに: asp:ButtonClickイベントが発生していません

(これらはすべて同様の提案をします)

于 2012-08-10T11:00:09.493 に答える
1

これを試してくださいhttp://msdn.microsoft.com/ru-ru/library/system.web.ui.webcontrols.button.command(v=vs.90).aspx

btnsearchName.Command += new CommandEventHandler(this.btnsearchName_Click);

btnsearchName.CommandName = "Click";

于 2012-08-10T11:13:37.493 に答える
0

ボタンを再作成し、毎回イベントハンドラーをアタッチする必要があります。このために、ボタンのリストを作成し、セッションに保存します。ページの読み込み時に、リストを確認し、毎回ボタンを作成します

public Button create_button()
{
        btnsearchName.ID = "btnsearchName";
        btnsearchName.Text = "Search";
        btnsearchName.Click += new EventHandler(this.btnsearchName_Click);

       return btnsearchName;
 }

 public TextBox create_textbox()
 {
      TextBox tbsearchByName = new TextBox();
        Button btnsearchName = new Button();
        tbsearchByName.Width = 250;
        tbsearchByName.ID = "tbsearchByName";
        tbsearchByName.Text = "Enter the full name of a student";
        return tbsearchByName;
 }


protected void btnsearchByName_Click(object sender, EventArgs e)
{
    TextBox tbsearchByName = create_textbox();
    Button btnsearchName = create_button();
    //add to panels
    pnlsearchStudents.Controls.Add(tbsearchByName);
    pnlsearchStudents.Controls.Add(btnsearchName);

   //add to session
   List<Button> lstbutton = Session["btn"] as List<Button>
   lstbutton.add(btnsearchName);
   //similarly add textbox

  //again add to session
  Session["btn"] = lstbutton 
}

public override page_load(object sender, eventargs e)
{
   //fetch from session, the lstButton and TextBox and recreate them
   List<Button> lstbutton = Session["btn"] as List<Button>;
   foreach(Button b in lstbutton)
       pnlsearchStudents.Controls.Add(b);

   //similar for textbox

}
于 2012-08-10T11:07:21.850 に答える
0

よくわかりませんが、このようにOnInit()メソッドをオーバーライドする必要があるかもしれません。

 protected override void OnInit(EventArgs e)
 {
    base.OnInit(e);
 } 
于 2012-08-10T11:16:37.603 に答える
-1

このコードをjqueryコードの準備完了状態に追加するだけで、動的ボタンでも正常に機能します

$(document).ready(function(){
   $('input#tbsearchByName').click(function(){
         // code goes here
   });
});
于 2012-08-10T11:04:15.870 に答える