2017-11-26 3 views
0

지난 몇 시간 동안 검색을했는데 문제가 해결되지 않았습니다. 제목은 매우 어리지만 내 상황을 정확하게 묘사 한 것 같습니다. 아래 코드를 참조하십시오. Repeater의 ItemDataBound 이벤트에 SelectedIndexChanged 함수를 추가하려고 시도했지만, 포스트 백 이벤트가 페이지에서 핸들러를 잊어 버린 것처럼 보입니다. Triggers.Add를 사용하여 AsyncPostbackTrigger를 추가하는 경우에도 마찬가지입니다.UpdatePanel RadioButtonList AsyncPostback EventHandler Lost

해결 된 솔루션은 포스트 백에서 EventHandler를 다시 추가하는 것이었지만 이것이 나를위한 해결책은 아닙니다. 나는 실제 DataBinding과 독립적으로 내 repeater DataSource를 반복하는 사용자 정의 함수를 작성한 다음 적용 가능한 경우 EventHandler를 구체적으로 다시 바인드 할 수 있습니다. 그러나 이것은 매우 무차별적인 방식 인 것으로 보입니다. 저의 목표를 성취 할 수있는 더 좋은 방법이 있습니까?

프런트 엔드 :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="smMain" runat="server" /> 
     <div> 
      <asp:UpdatePanel ID="updTest" runat="server" UpdateMode="Conditional"> 
       <ContentTemplate> 
        <asp:Repeater ID="rptTest" runat="server" OnItemDataBound="rptTest_ItemDataBound"> 
         <ItemTemplate> 
          <asp:RadioButtonList ID="rblTest" runat="server" RepeatDirection="Horizontal" ClientIDMode="AutoID" /> 
         </ItemTemplate> 
        </asp:Repeater> 
       </ContentTemplate> 
      </asp:UpdatePanel> 
     </div> 
    </form> 
</body> 
</html> 

백 엔드는 :

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      DataTable dt = new DataTable(); 

      dt.Columns.Add("Test"); 

      DataRow dr = dt.NewRow(); 

      dr["Test"] = "FirstRow"; 

      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 

      dr["Test"] = "SecondRow"; 

      dt.Rows.Add(dr); 

      rptTest.DataSource = dt; 
      rptTest.DataBind(); 
     } 
     else 
     { 
      // This works, but it's very, very ugly. Also, I have no way of being able to test for which function I actually want to call! 
      ((RadioButtonList)FindControl(Request.Params["__EVENTTARGET"])).SelectedIndexChanged += testFunction; 
     } 
    } 

    protected void rptTest_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     RadioButtonList rbl = (RadioButtonList)e.Item.FindControl("rblTest"); 

     DataTable dt = new DataTable(); 

     dt.Columns.Add("ButtonName"); 
     dt.Columns.Add("ButtonID"); 

     DataRow dr = dt.NewRow(); 

     dr["ButtonName"] = "Yes"; 
     dr["ButtonID"] = "1"; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 

     dr["ButtonName"] = "No"; 
     dr["ButtonID"] = "2"; 

     dt.Rows.Add(dr); 

     rbl.DataTextField = "ButtonName"; 
     rbl.DataValueField = "ButtonID"; 
     rbl.DataSource = dt; 
     rbl.DataBind(); 

     rbl.AutoPostBack = true; 
     //This doesn't work. Even though it's set here, it doesn't "remember" the setting on postback 
     //rbl.SelectedIndexChanged += testFunction; 
     //This doesn't work either. Again, it doesn't "remember" the setting on postback 
     //updTest.Triggers.Add(new AsyncPostBackTrigger() { ControlID = rbl.UniqueID }); 
    } 

    private void testFunction(object sender, EventArgs e) 
    { 

    } 
} 

답변

0

문제에 대한 해결책을 발견. 본질적으로 ItemDataBound 이벤트 대신 ItemCreated 이벤트에서 EventHandler를 바인딩해야합니다. ItemCreated 이벤트는 첫 번째 이벤트뿐만 아니라 각 포스트 백마다 시작되므로 EventHandler가 올바르게 다시 바인딩 될 수 있습니다.

프런트 엔드 :

<asp:Repeater ID="rptTest" runat="server" OnItemCreated="rptTest_ItemCreated" OnItemDataBound="rptTest_ItemDataBound"> 

백 엔드 :

protected void rptTest_ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    RadioButtonList rbl = (RadioButtonList)e.Item.FindControl("rblTest"); 

    rbl.SelectedIndexChanged += testFunction; 
}