1

カスタム 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;
}

「test」を RadioButtonList に変更し、ページで「クリア」をクリックしてからポストバックすると、「選択された項目がありません」というテキストが表示されます。これが必要です。これは.Net 4で実行されており、同じバグで.Net 4.5でも試しました。

4

1 に答える 1

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);
}
}
于 2013-05-08T14:29:51.750 に答える