2011-07-21 12 views
0

動的に生成されるボタンコントロールをクリックすると、実際にb_Clickメソッドが呼び出され、指定されたユーザーは削除されますが、新しいユーザーのリスト。 Page_Loadイベントは、ユーザーがそこにまだあるのPage_Loadでデータベースからユーザーのリストを取得しているので、Clickイベントの前に呼び出されるためですAsp.net:動的に生成されたボタンコントロールをクリックした後にページが更新されない

 protected void Page_Load(object sender, EventArgs e) 
     { 
      DbDB db = new DbDB(); 
      List<User> users = db.GetUsers().ExecuteTypedList<User>(); 

      foreach (User u in users) 
      { 
      Button b = new Button(); 
      b.Text = u.FirstName; 
      b.Click += new EventHandler(b_Click); 
      PlaceHolder1.Controls.Add(b); 

      } 

     } 
     } 

     void b_Click(object sender, EventArgs e) 
     { 

      Button b = (Button)sender; 
      DbDB.User.Delete(x => x.FirstName == b.Text); 

     } 
+0

AJAX呼び出しでb_clickを呼び出していますか?それはポストバックを実行していないので、あなたはAJAXコールバックのjavascriptでリフレッシュを追加する必要があるかもしれません。 – MunkiPhD

+0

Nope asp.netが生成するもの以外のjsはありません。 – Jason

答えて

2
protected void Page_Load(object sender, EventArgs e) { 
    LoadUsers(); 
} 

void b_Click(object sender, EventArgs e) {  
    Button button = (Button)sender; 
    string firstName = button.CommandArgument; 
    DbDB.User.Delete(x => x.FirstName == firstName); 

    PlaceHolder1.Controls.Remove(button); 
} 

void LoadUsers() { 
    DbDB db = new DbDB(); 
    List<User> users = db.GetUsers().ExecuteTypedList<User>(); 

    foreach (User user in Users) { 
     Button button = new Button();   
     button.CommandArgument = user.FirstName; // normally the user "id" to identify the user. 
     button.Text = user.FirstName; 
     button.Click += new EventHandler(b_Click); 
     PlaceHolder1.Controls.Add(button); 
    } 
} 
+2

間違っていると、動的に生成されたコントロールをポストバックに再作成する必要があります。私は賭けることができる、クリックイベントはこの場合呼び出されません。 –

+0

@ムハンマド - 正しい。 – gangelo

1

。迅速な解決策として、コードをPage_LoadからPreRenderイベントに移動することができます。

は、ページのライフサイクルの詳細は、このリンクを見てください:http://msdn.microsoft.com/en-us/library/ms178472.aspx

+0

これからPreInitになると思いますが、リンクのドキュメントによれば動的コントロールが作成されるはずです。しかし、それは堅い動作しません。 – Jason

0

あなたはすべてのポストバックを持つユーザーを選択する必要はありません。また、実行時にコントロールを作成する必要はありません。

次の方法があります。

<asp:Repeater runat="server" ID="myRepeater"> 
    <ItemTemplate> 
     <asp:Button runat="server" OnClick="Button_Click" Text='<%# DataBinder.Eval(Container.DataItem, "FirstName") %>' /> 
    </ItemTemplate> 
</asp:Repeater> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!this.IsPostBack) 
    { 
     // load users 
     myRepeater.DataSource = users; 
     myRepeater.DataBind(); 
    } 
} 

protected void Button_Click(object sender, EventArgs e) 
{ 
    // delete user 
    Button button = sender as Button; 
    button.Visible = false; 
} 
0

は動作するはず

if(!IsPostBack) 
{ 
    .... 
} 

の内側にあなたのPage_Load本体を書きます。

+0

いいえ、これは役に立ちません。 – Jason

+0

次に、page_loadが動的コントロールを作成する場所ではないため、メソッド本体をpage_initメソッドに移動します。 – gaurawerma

関連する問題