2012-06-16 104 views
3

我想動態聲明一個ImageButton。動態創建一個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

看看這個answer,它與動態控制和事件

正如喬恩評論,你可以不加關係一個事件的字符串,在這種情況下,您需要爲該事件添加處理程序:

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 
    } 

Alternativeley

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

Lambda表達式這有一個壞的代碼味道。我鼓勵使用命名函數。 – jcolebrand

+0

thanx很多爲你的幫助... – Kemoid

+0

@jcolebrand:爲什麼?如果這裏只有少量的代碼不需要從其他任何地方調用(例如,它可能只是調用具有更合適簽名的方法),那麼在這裏使用lambda表達式看起來沒什麼問題。 –

5

您無法爲此類方法分配值,即使它可以訪問也是。您需要訂閱事件:

btn.Click += ClickHandlingMethod; 
+0

感謝名單了很多的幫助... – Kemoid

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 
    // ... 
} 
+0

感謝名單了很多的幫助... – Kemoid