以编程方式添加ImageButton

时间:2010-01-18 17:10:46

标签: asp.net controls

我有一个类似下面的代码片段,我想在页面加载期间将图像按钮添加到我的asp:Panel中。但是当我运行页面时,事件已经发生了。我希望它在被点击时被触发。

提前感谢所有帮助

    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;
    }

3 个答案:

答案 0 :(得分: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

  

<强>初始化

     

在初始化所有控件和任何皮肤后引发   设置已应用。用这个   读取或初始化控件的事件   属性。

  

<强>加载

     

Page调用OnLoad事件方法   在页面上,然后递归地执行   对于每个儿童控制都是一样的   为每个孩子做同样的事情   控制直到页面和所有   控件已加载。

     

使用OnLoad事件方法进行设置   控制和建立的属性   数据库连接。

答案 1 :(得分:0)

您需要查看页面生命周期 - http://msdn.microsoft.com/en-us/library/ms178472.aspx

答案 2 :(得分:0)

您应该在Page Init事件中添加控件,正如其他人所说的那样。

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

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

}

请注意,您无法将“Gift”对象直接传递给ImageButton_Click。你必须找到另一种方法。