2009-04-06 7 views
3

次のコードを使用して2回目のクリックでコマンドイベント引数を取得するときに問題が発生しています。問題コマンドイベントでcommandeventargsを取得するときに、ポストバックのコントロールの再作成後に問題が発生する

私はボタンクリックを処理し、そこにあったものを置き換えるために新しいボタンを生成すると、次のボタンクリックでビューステートを失います。

これを動作させるには何が必要なのですか?私はコマンドハンドラには全く関係のないボタンの可変数を生成しなければならないので、構造を大きく変更することはできません。

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      LinkButton btn = new LinkButton(); 
      btn.ID = "btn1"; 
      this.Panel1.Controls.Add(btn); 
      btn.Command += new CommandEventHandler(myLinkButton_Command);   
     } 
     else 
     { 
      LinkButton btn = new LinkButton(); 
      btn.ID = "btn1"; 
      this.Panel1.Controls.Add(btn); 
      btn.Text = "My Button 1"; 
      btn.CommandArgument = "1"; 
      btn.Command += new CommandEventHandler(myLinkButton_Command); 
     } 
    } 

    void myLinkButton_Command(object sender, CommandEventArgs e) 
    { 
     int newArg = Convert.ToInt32(e.CommandArgument) + 1;// empty string on second mouse click 
     this.Panel1.Controls.Clear(); 
     LinkButton myLinkButton = new LinkButton();   
     myLinkButton.ID = "btn1"; 
     this.Panel1.Controls.Add(myLinkButton); 
     myLinkButton.Text = "My Button " + newArg.ToString(); 
     myLinkButton.CommandArgument = newArg.ToString(); 
    } 
} 

答えて

5

これは、パネルにリテラルコントロールがあるためです。ボタンを初めて追加すると、ボタン(ボタン)が2番目のコントロールになります。後でパネルのコントロールコレクションを消去すると、コントロールが最初のコントロールになり、最初のコントロール用にビューステートが保存されます。これは、次のポストバックでリテラルになります。

単に

<asp:Panel ID="Panel1" runat="server" /> 

<asp:Panel ID="Panel1" runat="server"> 
</asp:Panel> 

を変換し、それが動作します。

+0

ありがとう - 私はこれまで考えたことはないと思う。うまくいけば、これは私の実際のプロジェクトで起こっていることに似ています。 – dice

0

あなたはPage_Loadの中にボタンを再作成するときCommandArgumentプロパティを設定するのを忘れています。

+0

その必要はありません。 CommandArgumentはビューステートで保持されます。問題は、リテラルの存在とコントロールのコレクションのボタンの位置の変更です – Ruslan

関連する問題