2013-05-08 3 views
1

사용자 정의 RadioButtonList에서 선택한 항목을 지우지 만 포스트 백에서는 작동하지 않습니다.상속 된 ASP.Net RadioButtonList에서 Javascript로 선택된 항목을 지우지 못함

ASP.Net RadioButtonList에서 상속받은 사용자 지정 컨트롤이 있습니다. 컨트롤에 처음 선택된 값이있는 경우 선택한 항목을 지우고 다시 게시를 수행하는 클라이언트 측 함수를 호출하면 처음에 선택한 항목이 다시 선택됩니다.

나는 작동하지만 단순히 하나에 내장 상속 클래스가 단순화 된 형태

실패되도록 ASP.Net RadioButtonList가, 다시 게시, 선택한 항목이 삭제됩니다 사용하는 경우 :

<div>  
<a href="javascript:Clear()">Clear</a> 
</div> 
<h1> 
    <asp:Label Text="ready..." runat="server" ID="lblTest" /></h1> 
<script type="text/javascript"> 
    function ChangeValue() { 
     var obj = document.getElementById('test_1'); 
     obj.checked = true; 
    } 

    function Clear() { 
     var obj = document.getElementById('test_0'); 
     obj.checked = false; 

     obj = document.getElementById('test_1'); 
     obj.checked = false; 
    } 
</script> 
<asp:Button ID="button" runat="server" onclick="button_Click" /> 
public class MyRadio : RadioButtonList 
{ 

} 

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 

    MyRadio test = new MyRadio(); 
    test.ID = "test"; 
    test.Items.Add(new ListItem("First", "First")); 
    test.Items.Add(new ListItem("Second", "Second")); 

    if (!Page.IsPostBack) 
     test.SelectedValue = "Second"; 

    this.Form.Controls.Add(test);   
} 
protected void button_Click(object sender, EventArgs e) 
{ 
    RadioButtonList rl = this.FindControl("test") as RadioButtonList; 
    if (rl.SelectedItem == null) 
     lblTest.Text = "No selected item"; 
    else 
     lblTest.Text = rl.SelectedItem.Value + " - " + rl.SelectedItem.Text; 
} 

뒤에 코드에서

나는 "테스트"나는이 필요하다 내가 텍스트 "아니오 선택한 항목을"참조, 다시 게시 RadioButtonList하고 페이지에 명확한 클릭을 변경하는 경우 ; 이것은 .Net 4에서 실행 중이며 .Net 4.5에서도 동일한 버그가 발생했습니다.

답변

0

해결 방법은 파생 클래스에서 IPostBackDataHandler를 구현하는 것입니다. 이걸 MSDN에서 찾은 동료 메이드

public class MyRadio : RadioButtonList, System.Web.UI.IPostBackDataHandler 
{ 
bool System.Web.UI.IPostBackDataHandler.LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection) 
{ 
    foreach (ListItem item in this.Items) 
    { 
     item.Selected = false; 
    } 

    return this.LoadPostData(postDataKey, postCollection); 
} 

void System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent() 
{ 
    this.RaisePostDataChangedEvent(); 
} 

protected override void OnPreRender(EventArgs e) 
{ 
    base.OnPreRender(e); 
    Page.RegisterRequiresPostBack(this); 
} 
}