2014-09-22 3 views
3

리피터를 UpdatePanel 내부에서 사용하고 데이터베이스에서 엔터티를 삭제하고 리피터에 대한 새 데이터를 가져오고 패널을 업데이트하는 버튼이 있습니다. LinkButton을 시도했지만 항상 포스트 백을 수행하고 페이지가 다시 연결됩니다. 그런 다음 일반 버튼을 시도하고 DataBound 이벤트에서 해당 버튼에 대한 이벤트를 만듭니다. 그러나 그것은 작동하지 않습니다. 여기 코드는 다음과 같습니다Asp.Net 버튼 UpdatePanel 내부의 리피터 내부 이벤트 이벤트

영문 파일 :

<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <asp:UpdatePanel runat="server" id="Panel"> 
     <ContentTemplate> 
      <table cellpadding="0" cellspacing="0" id="saveTable"> 
       <tr style="font-weight: bold;"> 
        <td>Erstellt am</td> 
        <td>Anforderer</td> 
        <td>Werk</td> 
        <td>Gebäude</td> 
        <td>Start Datum</td> 

        <td>Löschen</td> 
        <td>Benutzen</td> 
       </tr> 


      <asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound"> 
       <ItemTemplate> 

       <tr id="Meldung<%# DataBinder.Eval(Container.DataItem,"meldungId")%>"> 
        <td><%# DataBinder.Eval(Container.DataItem, "timestamp").ToString().Substring(0, 10)%></td> 
        <td><%# DataBinder.Eval(Container.DataItem,"nameAnforderer") %></td> 
        <td><%# DataBinder.Eval(Container.DataItem,"Werk") %></td> 
        <td><%# DataBinder.Eval(Container.DataItem,"Building") %></td> 
        <td><%# DataBinder.Eval(Container.DataItem,"startDatum").ToString().Substring(0, 10) %></td> 
        <td> 
         <asp:Button runat="server" ID="test"/> 
        </td> 
        <td></td> 
       </tr> 

       </ItemTemplate> 
      </asp:Repeater> 
      </table> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

및 코드에서 내가 ID로 버튼을 제공 뒤에

= 작업은 텍스트를 전달하고 무슨 있도록 이벤트

protected void deleteMeldung(object sender, EventArgs e) { 
     System.Threading.Thread.Sleep(5000); 
    } 

    protected void Repeater1_ItemDataBound(object source, RepeaterItemEventArgs e) { 
     RepeaterItem repeaterSource = e.Item; 
     Button btn1 = repeaterSource.FindControl("test") as Button; 
     DataRowView drv = e.Item.DataItem as DataRowView; 
     string meldungId = drv.Row["meldungId"].ToString(); 

     btn1.ID = "myNewButton"+meldungId; 
     btn1.Click += new EventHandler(deleteMeldung); 
     btn1.Text = "delete"; 

    } 

을 테스트하고 ID와 같은 각 버튼에. 하지만 Button에는 클릭 이벤트가 없습니다. deleteMeldung()

+1

에 새로운 데이터를 업데이트 : 이렇게하면 페이지를 새로 고침하지 않을 것입니다.이 링크 버튼을 사용할 수 있습니다 .. –

답변

2

내가하는 경향이있는 것은 리피터 바깥쪽에 별도의 삭제 버튼을 갖는 것입니다 (보통 asp : 'display : none'으로 설정된 스타일의 버튼입니다.

리피터의 내부 버튼은 포스트 백을 발생시키지 않지만 숨겨진 필드 HF_DeleteId에만 주어진 행의 ID를 설정 한 다음 $ (()를 호출합니다. '#B_Delete'). (B_Delete를 버튼의 현재 ClientID로 바꿔야하는 곳)을 클릭하십시오 (B_Delete_Click). 그러면 서버 메소드 B_Delete_Click에서 숨겨진 필드에서 삭제할 행의 ID를 검색 할 수 있습니다. 동적으로 생성 된 b에서 트리거 및 처리 이벤트를 망칠 필요가 없습니다. uttons.

그것은 다음과 같이 보일 수 있습니다 :

<asp:UpdatePanel runat="server" ID="UP_Rptr" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:Repeater runat="server" ID="RPTR_DeleteTest" EnableViewState="False" OnItemDataBound="RPTR_DeleteTest_ItemDataBound"> 
      <ItemTemplate> 
       <div> 
        <span><%# Eval("ID") %></span> 
        <span><%# Eval("Name") %></span> 
        <span><asp:LinkButton runat="server" ID="LB_Delete" Text="delete"></asp:LinkButton></span> 
       </div> 
      </ItemTemplate> 
     </asp:Repeater> 

     <asp:HiddenField runat="server" ID="HF_DeleteId" />   
     <asp:Button runat="server" ID="B_Delete" OnClick="B_Delete_Click" Style="display:none;" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

그리고 서버 방법 :

protected void RPTR_DeleteTest_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    var lb = e.Item.Controls[1] as LinkButton; // for simplicity only - do not use code like this 
    lb.OnClientClick = String.Format("$('#{0}').val('{1}');$('#{2}').click();return false;",           
       HF_DeleteId.ClientID, 
       DataBinder.Eval(e.Item.DataItem, "ID"), 
       B_Delete.ClientID); 
} 

protected void B_Delete_Click(object sender, EventArgs e) 
{ 
    int id = Int32.Parse(HF_DeleteId.Value); 
    // do your sanity checks and deletion logic here 
} 
0

내가 Pafkas 솔루션을 시도하고 일했다, 그 주셔서 감사합니다.

 btn1.Click += new EventHandler((sender1, e1) => deleteMeldung(sender1, e1, meldungId)); 

     ScriptManager scriptManager = ScriptManager.GetCurrent(Page); 
     if (scriptManager != null) { 
      scriptManager.RegisterAsyncPostBackControl(btn1); 
     } 

이 링크 버튼 :

<asp:LinkButton runat="server" ID="test"/> 
그러나, 나는이 문제를 해결하는 다른 방법이 있는지 intressted하고 있었고, 난 다른 해결책을 발견, 그와 같은 스크립트 관리자와 모든하는 LinkButton을 registred 이 일

, 그것은 놀이를 reloding없이 deleteMeldung 방법은 enterie을 삭제 매개 변수 meldungId을 통과 해고하고 사용할 수있는 UpdatePanel

+0

잘하고 있습니다. 이 접근법은 실행 가능하지만 제 의견에는 단점이 있습니다. 동적 버튼 이벤트가 발생하려면 다시 보내기 전에 모든 컨트롤 (예 : 반복기)을 다시 구성해야합니다. 이것은 중계기가 viewstate를 사용하도록하거나, 각 포스트 백에서 데이터베이스의 데이터를로드하는 것을 의미합니다. 그런 다음 이벤트를 처리 한 후에 변경 사항을 반영하기 위해 대개 다시 채워야합니다. 큰 문제는 아니지만,이를 피할 수있는 방법이 있다면, 아마 더 나은 일일 것입니다. – Pafka

관련 문제