2010-04-17 8 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) {...} 

하지만, 내 상황이 테이블 셀 객체를 선택할 수 없습니다 그래서 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"은 자바 스크립트 함수는 클라이언트 측 작동합니다. 내가 찾고있는 것은이 테이블 셀에 .cs CodeBehind에 정의 된 서버 측 clickHandler() 함수를 연결하는 방법입니다.

오후에 검색 한 결과 나는 제대로 된 해결책을 찾지 못했습니다. 모든 도움을 미리 감사드립니다.

답변

4

많은 연구와 연구 끝에 작업 솔루션을 함께 구상 할 수 있었지만 이미 내장되어 있어야하는 무언가에 대한 엄청난 노력과 같이 보입니다.

다음
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); 
      } 
     } 
    } 
} 

내가 (거의 정확하게 주식의 테이블 셀 같은) 내 새로운 클래스를 사용하는 방법입니다 : 내가 한 일은 OnClick 이벤트에 대한 핸들을 포함하도록 System.Web.UI.WebControls.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

이게 당신의 문제와 관련이 있는지는 모르겠지만 LinkButton에 서버 측 함수를 추가하려고 시도하고 다음 VB 코드를 찾았습니다 : 나를 위해 일한 AddHandler cell.Click, AddressOf clickHandler.

this code conversion service에 따르면이 값은 C#에서 cell.Click += clickHandler;으로 변환됩니다.

희망이 도움이됩니다.

관련 문제