2010-02-02 2 views
7

TemplateView를 통해 GridView 내부에 LinkButton이 있습니다. 무엇을 시도하든 관계없이 LinkButton은 해당 이벤트 핸들러를 호출하지 않습니다.GridView 내의 LinkButton이 OnClick 이벤트를 발생시키지 않는 이유는 무엇입니까?

  1. 전통적인 이벤트 핸들러 ("의 OnClick")에의 GridView 수준에서
  2. OnRowCommand 이벤트 핸들러 : 나는 모두를 시도했다.

두 경우 모두 디버깅을했는데 이벤트 처리기를 잡아 내지 못합니다.

페이지에서 LinkButton을 이동하면 (GridView에 없기 때문에) 올바르게 작동하므로 구문이 옳다는 것을 알고 있습니다. 흥미로운 무엇

<asp:TemplateField> 
    <ItemTemplate> 
    <asp:LinkButton Text="Cancel" ID="DeleteButton" CausesValidation="false" OnClick="CancelThis" runat="server" /> 
    </ItemTemplate> 
<asp:TemplateField> 

내가 뒤에있는 코드에서 "CancelThis"방법을 제거하는 경우,이 오류가 발생합니다입니다 : 여기

는 "전통적인"방법이다. 따라서 컴파일 할 때 이벤트 핸들러를 찾았 기 때문에 이벤트 핸들러에 대해 알고 있습니다. 여기

은 RowCommand 방법입니다 :

<asp:TemplateField> 
    <ItemTemplate> 
    <asp:LinkButton Text="Cancel" ID="DeleteButton" CausesValidation="false" CommandName="CancelThis" runat="server" /> 
    </ItemTemplate> 
<asp:TemplateField> 

이 경우,의 GridView가 있습니다 이벤트를 제기에서

OnRowCommand="GridView_RowCommand" 

그것은 postsback, 그러나 결코 힌트.

내가 여기에 무엇을 놓치고 있는지 알 수 있습니까?

답변

0

GridView에서 viewstate가 켜져 있습니까? 이것은 여러 번 나를 잡았습니다.

10

GridView을 어떻게 구속하고 있습니까? 데이터 소스 컨트롤을 사용하고 있습니까? Page_Load 동안 수동으로 바인딩하는 경우 그리드가 모든 왕복을 바인딩하기 때문에 이벤트 처리기가 제대로 캐치하지 못하는 것일 수 있습니다. 이 경우 다음과 같이 시도해보십시오.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!Page.IsPostBack) 
    { 
     //do binding 
    } 
} 

마크 업과 함께 사용하기 위해 샘플 바인딩 코드를 게시 할 수 있습니까?

실제적으로이 문제가 되려면 Grid의 RowDataBound 이벤트에 연결하고 단추를 수동으로 찾은 다음 코드 뒤에 처리기를 추가하면됩니다. 뭔가 같은 :

마크 업 조각 :

<asp:GridView ID="gvTest" runat="server" OnRowDataBound="gvTest_RowDataBound" /> 

코드 숨김

protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //find button in this row 
     LinkButton button = e.Row.FindControl("DeleteButton") as button; 
     if(button != null) 
     { 
      button.Click += new EventHandler("DeleteButton_Click"); 
     } 
    } 
} 

protected void DeleteButton_Click(object sender, EventArgs e) 
{ 
    LinkButton button = (LinkButton)sender; 
    // do as needed based on button. 
} 

내가 당신을 버튼의 목적이 무엇인지 모르겠지만,이 행이 삭제 버튼입니다 가정 RowCommand 이벤트를 사용하는 것처럼 이벤트 핸들러 에서처럼이 접근 방식을 사용하고 싶지 않을 수 있습니다. 문제의 행에 직접 액세스 할 수 없습니다.

템플릿 입력란을 사용하는 이유가 있습니까? 대가가 ButtonField일까요?ButtonField을 사용하는 경우 RowCommand 이벤트에 연결할 수 있습니다.

마크 업 조각 : 뒤에

<asp:GridView ID="gvTest" runat="server" OnRowCommand="gvTest_RowCommand"> 
    <columns> 
     <asp:buttonfield buttontype="Link" commandname="Delete" text="Delete"/> 
     .... 
    </columns> 
</asp:GridView> 

코드 :

  • RowCommandEvent
  • ButtonField class
  • :

    protected void gvTest_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
        if(e.CommandName == "Delete") 
        { 
         //take action as needed on this row, for example 
         int rowIndex = Convert.ToInt32(e.CommandArgument); 
         GridViewRow currentRow = (sender as GridView).Rows[rowIndex]; 
    
         //do something against the row... 
        } 
    } 
    

    당신은 이러한 주제 중 일부에 대한 MSDN의 문서를 참조 할 수 있습니다 16,

편집 :

가 ButtonField에 귀하의 질문에 대답하려면 - 당신은 여전히 ​​buttonfield 처리 할 수없는 이유 그래 난이 표시되지 않습니다. 여기에 ButtonField를 사용

protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //let's assume your buttonfield is in column 1 
     // (you'd know this based on your markup...) 
     DataControlFieldCell cell = e.Row.Cells[1] as DataControlFieldCell; 
     if(cell != null) 
     { 
      ButtonField field = cell.ContainingField as ButtonField; 

      //based on your criteria, show or hide the button 
      field.Visible = false; 
      //or 
      field.Visible = true; 
     } 
    } 
} 
+0

프로그래밍 숨기거나 그것을 보여주는 방법이있다, (... 안된하지만 난 일 것이라고 생각) 코드 조각 바운드 행 데이터 중 buttonfield을 찾아 그것을 숨길 수있어? 현재 반복의 일부 값에 따라 버튼을 표시하거나 표시하지 않을 수도 있습니다. 내가 읽은 모든 것은 TemplateField의 표준 Button으로 전환해야한다고했습니다. 현재 메서드에서는 RowDataBound 이벤트를 사용하여 현재 반복을 검사하고 단추를 찾은 다음 숨길 수 있습니다. – Deane

+0

나는 그것이 가능할 것이라고 생각한다. 샘플 코드를 첨부하여 내 대답을 편집했습니다. –

-1
<button onclick="window.open('<%#Eval("ReportLinks")%>', '_blank');" title='<%#Eval("ReportLinks")%>'> Link</button> 
관련 문제