0

フォームの送信内容に基づいて動的にボタンを作成する C# Web ページを作成しようとしていますが、行き止まりまで実行し続けています。問題は (どうやら?) ボタンの Click イベント内ではなく、Page_Load 中にのみ EventHandler をフックできることです。

基本的に、ボタンを作成するためのコードがいくつかあります。

private Button CreateButton(string id, string text) {
    Button b = new Button();
    b.ID = id;
    b.Text = text;
    b.Command += new CommandEventHandler(Button_Command);
    b.CommandArgument = text;
    return b;
}

これらの新しいボタンがクリックされると、コマンド引数が渡され、それらのコマンド引数に基づいて新しいボタンが作成されます。

void Button_Command(object sender, CommandEventArgs e) {
    //Put code here that creates new buttons based on what's submitted
    DoThis(e.CommandArgument.ToString());
}

しかし、ボタンのクリック イベント内でこのコードを実行すると、新しく作成されたボタンの EventHandler が接続されません。

最初にページにアクセスしたときは、テキスト入力と GO ボタンしかありません。コマンド引数とともに一連の新しいボタンを作成する必要があります。

protected void bntGo_Click(object sender, e EventArgs){
    DoThis(txtInput.Text);
}

private void DoThis(string arg){
    //Do some logic to create a Dictionary<string, int> object (sortedDict) 
    //based on the arg passed, then for each KeyValuePair in the Dictionary, 
    //add a button to a panel on the page, setting each button's commandarguments 
    //to each string in the dictionary
    int count=1;
    foreach (KeyValuePair<string, int> pair in sortedDict) {
        pnlButtonsPanel.Controls.Add(CreateButton("Btn"+count.ToString(), pair.Key));
    }
}

どうすればこれを達成できますか? DoThis() は、クリックしたボタンから CommandArguments を渡す必要があるため、ページが読み込まれるたびに DoThis() 関数を実行することはできませんが、これは page_load 内では使用できません。

私は何を間違っていますか?新しいアプローチが必要です。私はここで自分自身を円で考えています。

ありがとう!

4

2 に答える 2

0

ハンドラーを登録することはできません。実際にフォームを送信し、サーバー上のコマンドに相当する文字列を解析する必要があります。したがって、RunAt サーバー。レンダリングされたページとサーバーの間には、Javascript と呼ばれる魔法のような接続はありません。

ここで設計パターンに従っていますか?

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.commandeventhandler.aspx

  <asp:Button id="Button1"
       Text="Sort Ascending"
       CommandName="Sort"
       CommandArgument="Ascending"
       OnCommand="CommandBtn_Click" 
       runat="server"/>

...

void CommandBtn_Click(Object sender, CommandEventArgs e) 
      {

         switch(e.CommandName)
         {

            case "Sort":

               // Call the method to sort the list.
               Sort_List((String)e.CommandArgument);
               break;
于 2013-02-04T07:58:06.390 に答える
0

Page_Init または Page_Load にイベント ハンドラを追加する必要がある理由は次のとおりです。

サーバーへのすべてのポストバックにより、ページが最初から再構築されます (完全に静的なページであり、キャッシュされている場合を除く)。これにより、すべての動的変更 (ボタンの追加など) が失われます。したがって、動的に作成されたボタンをクリックし、Page_Init または Page_Load でボタンとすべてのハンドラーを再作成しない場合、すべての意図と目的のために、ボタンはサーバー側に存在しません。


編集:

各ボタンの詳細を含むリストを保存する必要がある場合は、ViewState

protected void Page_Init (object sender, EventArgs e)
{
    //do your stuff
    var buttonStuff = ViewState["MySaveButtonStuff"] as List<string>;
    if (buttonStuff != null)
    {
        //create button method(s)
    }
}
于 2013-02-04T08:05:16.010 に答える