2010-04-17 72 views
1

我正在尋找一種以編程方式爲TableCell對象設置OnClick事件處理程序的方法。在ASP相當於什麼,我試圖做看起來就像這樣:以編程方式設置服務器端OnClick()事件

<asp:TableCell OnClick="clickHandler" runat="server">Click Me!</asp:TableCell> 

在上面的例子中,「clickHandler事件」是的.cs代碼隱藏定義的服務器端功能。

public virtual void clickHandler(object sender, EventArgs args) {...} 

但是,對於我的情況,這個TableCell對象需要動態創建,因此將它設置爲ASP標記不是一個選項。我試圖做類似的代碼隱藏以下內容:

System.Web.UI.WebControls.TableRow row = new System.Web.UI.WebControls.TableRow(); 
System.Web.UI.WebControls.TableCell cell = new System.Web.UI.WebControls.TableCell(); 
cell.Text = "Click Me!"; 
cell.Attributes.Add("onClick", "clickHandler"); 
row.Cells.Add(cell); 

不幸的是,在這種情況下:

cell.Attributes.Add("onClick", "clickHandler"); 

的「clickHandler事件」只能作爲客戶端的JavaScript功能。我正在尋找的是一種將.cs CodeBehind中定義的服務器端clickHandler()函數鏈接到此表格單元格的方法。

經過一個下午的搜索,我一直無法提出一個工作解決方案。預先感謝您的幫助。

回答

4

經過大量的工作和研究,我能夠拼湊出一個工作解決方案,但對於應該已經內置的東西來說,它似乎是一項可怕的工作。我所做的就是擴展System.Web.UI.WebControls.TableCell對象以包括onClick事件句柄:

using System; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace MyWebApp 
{ 


    public class ExpandableTableCell : TableCell, IPostBackEventHandler, INamingContainer 
    { 
     private static readonly object click_event = new object(); 

     public ExpandableTableCell() 
     { 
     } 

     // public handles for adding and removing functions to be called on the click event 
     public event EventHandler Click 
     { 
      add 
      { 
       Events.AddHandler(click_event, value); 
      } 
      remove 
      { 
       Events.RemoveHandler(click_event, value); 
      } 
     } 

     // define parent function that will be called when the container is clicked 
     protected void Click(EventArgs e) 
     { 
      EventHandler h = Events[click_event] as EventHandler; 
      if (h != null) 
      { 
       h(this, e); 
      } 
     } 

     // specify the "post back event reference" or id of the click event 
     protected override void AddAttributesToRender(HtmlTextWriter writer) 
     { 
      base.AddAttributesToRender(writer); 
      writer.AddAttribute(HtmlTextWriterAttribute.Onclick, 
           Page.ClientScript.GetPostBackEventReference(this, "custom_click")); 
     } 

     // link the custom click id to the click function 
     void System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument) 
     { 
      if(eventArgument == "custom_click") 
      { 
       this.OnClick(EventArgs.Empty); 
      } 
     } 
    } 
} 

這是我如何用我的新類(幾乎完全一樣的股票的TableCell):

System.Web.UI.WebControls.TableRow row = new System.Web.UI.WebControls.TableRow(); 
ExpandableTableCell click_cell = new ExpandableTableCell(); 
click_cell.Text = "Click Me!"; 
click_cell.Click += clickHandler; 
// extra little touch for mouseover event 
click_cell.Attributes.Add("onmouseover", "this.style.cursor='pointer'"); 
row.Cells.Add(click_cell); 

正如我所說,似乎經歷了擴展類,以在代碼隱藏中設置OnClick方法過多的麻煩。如果任何人有任何其他想法或任何方式來清理或合法化上面的代碼,請讓我知道。

0

我不知道這是否與您的問題有關,但我試圖將一個服務器端函數添加到LinkBut​​ton,並找到以下(VB)代碼:AddHandler cell.Click, AddressOf clickHandler,這對我很有用。

根據this code conversion service,這轉換爲C#中的cell.Click += clickHandler;

希望這會有所幫助!

相關問題