2010-01-18 72 views
1

我有一个像下面的代码片段,我想在页面加载期间将imagebuttons添加到我的asp:Panel中。但是当我运行这个页面时事件已经被触发了。我希望它被点击时被解雇。以编程方式添加ImageButton

预先感谢所有帮助

protected void Page_Load(object sender, EventArgs e) 
    {... 

     foreach (Gift g in bonusGifts) 
     { 
      ImageButton ib = new ImageButton(); 
      ib.ImageUrl = g.GiftBanner; 
      ib.ID = g.GiftID.ToString(); 
      ib.Click += Purchase(g); 
      BonusGiftPanel.Controls.Add(ib); 

     } 
    } 

    private ImageClickEventHandler Purchase(Gift g) 
    { 
     _giftRep.Purchase(g, _userSession.CurrentUser); 
     lblGifts.Text = "You have purcased " + g.GiftName + " for " + g.BonusPoints; 

     return null; 
    } 

回答

0

您应该添加在页面初始化事件的控件,其他说。

您的图像单击事件处理程序不符合ImageButton Click事件处理程序签名。这应该是这个样子:

private void ImageButton_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs) 
{ 

} 

请注意,你不能直接通过您的“礼品”对象到ImageButton_Click。你将不得不寻找另一种方法来做到这一点。

1

添加控件在Page_Init,而不是在你的Page_Load。 [1]

此外,你没有按照它应该这样做。考虑以下代码

//your collection of objects goes here. It might be something different than 
//this, but basically a Dictionary<int, YourType> goes fine 
public Dictionary<Int32, string> Ids 
{ 
    get { return (ViewState["ids"] ?? new Dictionary<Int32, string>()) as Dictionary<Int32, string>; } 
    set { ViewState["ids"] = new Dictionary<Int32, string>(); } 
} 

protected void Page_Init(object sender, EventArgs e) 
{ 
    //load the data using your DAO 
    Ids = new Dictionary<int, string>(); 

    Ids.Add(1, "http://www.huddletogether.com/projects/lightbox2/images/image-2.jpg"); 
    Ids.Add(2, "http://helios.gsfc.nasa.gov/image_euv_press.jpg"); 

    foreach (var item in Ids) 
    { 
     ImageButton imb = new ImageButton() 
     { 
      ImageUrl = item.Value, 
      CommandArgument = item.Key.ToString(), 
      CommandName = "open" 
     }; 

     imb.Click += new ImageClickEventHandler(imb_Click); 

     PH1.Controls.Add(imb); 
    } 
} 

void imb_Click(object sender, ImageClickEventArgs e) 
{ 
    Response.Write("You purchased " + Ids[int.Parse(((ImageButton)sender).CommandArgument)]); 
} 

[1](CTRL + C/Ctrl + V从一些其他的问题,我回答了上周):即必须保持之间的页面周期应该声明

一切在Page_Init,而不是Page_Load

所有初始化,如添加事件处理程序和添加控件都应该在初始化时添加,因为状态在页面循环之间保存。处理控件的内容和视图状态应在Load中完成。

还请检查http://msdn.microsoft.com/en-us/library/ms178472.aspx

初始化

毕竟控件都已初始化且已应用所有外观 设置引发。使用此 事件来读取或初始化控件 属性。

负载

页调用页面上OnLoad事件方法 ,然后递归确实的 相同为每个子控制,其 做同样对于其每个子的 控制,直到页面和所有 控件被加载。

使用OnLoad事件方法在控件中设置 属性并建立 数据库连接。

+0

当我从Page_Load更改为Page_Init时,发生同样的事情。 这行有什么不对吗 ib.Click + =购买(g); 因为它点击图像按钮之前触发点击事件! – Kubi 2010-01-18 17:25:36

+0

检查我的编辑.. – 2010-01-18 17:26:22