动态创建一个ImageButton

3

我正在尝试动态声明一个ImageButton。

我声明它并将ID和图像分配给它,如下所示:

ImageButton btn = new ImageButton();
btn.ImageUrl = "img/Delete.png";
btn.ID = oa1[i] + "_" + i;
btn.OnClick = "someMethod";

但是,当我尝试为按钮分配一个OnClick处理程序时,它会抛出以下异常:

System.Web.UI.WebControls.ImageButton.OnClick is inaccessible due to protection level
4个回答

5

即使该方法可访问,你也无法像那样为它赋值。你需要订阅事件:

btn.Click += ClickHandlingMethod;

4
一个例子:
private void CreateAButton()
{
    var button = new ImageButton();
    button.ImageUrl = "yourimage.png";
    button.ID = "Button1";
    button.Click += ButtonClick;

    Page.Form.Controls.Add(button);
}

private void ButtonClick(object sender, ImageClickEventArgs e)
{
    // Do stuff here
    // ...
}

4
请看这个答案,它与动态控件和事件有关。
正如Jon所评论的,您不能将字符串添加到事件中,在这种情况下,您需要为事件添加处理程序:
    protected void Page_Init(object sender, EventArgs e)
    {
        var i = new ImageButton();
        i.Click += new ImageClickEventHandler(i_Click);
        this.myPanel.Controls.Add(i);
    }

    void i_Click(object sender, ImageClickEventArgs e)
    {
        // do something
    }

另外,
    protected void Page_Init(object sender, EventArgs e)
    {
        var i = new ImageButton();
        i.Click += (source, args) =>
        {
            // do something
        };
        this.myPanel.Controls.Add(i);
    }

使用Lambdas表达式来实现这个功能会让代码变得难以理解。我建议使用命名函数来代替。 - jcolebrand
@jcolebrand:为什么?如果这里只有少量的代码,不需要从其他地方调用(例如,它可能只是调用一个具有更合适签名的方法),我认为在这里使用lambda没有任何问题。 - Jon Skeet
请注意,我没有提到将字符串添加到事件中 - 我说的是OP试图将一个值(恰好是一个字符串,但实际上这并不重要)分配给方法 - Jon Skeet
@jcolebrand:为什么?如果它只是做一件简单的事情,那么保持在订阅点:a) 意味着您可以清楚地看到它在做什么;b) 不会用一个你不想从其他任何地方使用的方法"污染"类的其余部分。如果有合法的理由将其分开——例如测试——那就是另一回事了,但我肯定不认为这是"糟糕的代码气味"。 - Jon Skeet
出于同样的原因,人们说使用三元运算符是一种糟糕的代码气味(这是我没有问题的事情)。在这种特定情况下,它刺激了我的代码感觉。我从来没有说过我一定是对的(我知道你也没有),我只是试图鼓励那些已经不理解“我正在分配一个字符串,但它不起作用”事件处理程序订阅的人坚持使用一些更少“高级”的东西。我知道Lambda表达式并不真正“高级”,但对于有些人来说,它们很难立即理解。在这里,命名函数通常更易于访问。 - jcolebrand
显示剩余3条评论

0

您可以使用以下代码(有一个重要更改):

private void CreateAButton()
    {
        var button = new ImageButton();
        button.ImageUrl = "yourimage.png";
        button.ID = "Button1";           
        button.PostBackUrl = "http://www.towi.lt";
        Page.Form.Controls.Add(button);
    }

关键在于 "PostBackUrl"。如果您编写了正确的链接,它将重定向到该链接(例如示例中)。否则,它会添加原始服务器名称、'/' 和您输入的文本。例如,'xxx' 将被转换为 "http://yourservername/xxx"。当您需要重定向到同一 ISS,但不同站点并动态创建用户按钮时,这非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接