2013-05-08 36 views
1

我需要清除自定義的RadioButtonList中選定的項目,但它不能在回發上工作。無法用繼承的ASP.Net上的Javascript清除選定的項目RadioButtonList

我有一個從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; 
} 

背後,如果我改變「測試」是一個單選按鈕列表,並在頁面點擊清楚,然後回來後,我看到文「無選擇項」,這正是我需要的;這是在.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); 
} 
}