1

我在转发器中有一个项目模板:

   <ItemTemplate>
        <li>
            <input type="radio" 
                   value="<%# GetAssetId((Guid) (Container.DataItem)) %>" 
                   name="AssetId" 
                   <%# SelectAsset((Guid) Container.DataItem) %> />

        </li>
    </ItemTemplate>

我有一个比较 id 并决定是否检查单选按钮的方法。

protected string SelectAsset(Guid uniqueId)
{
    if (uniqueId == GetSomeId()) 
        return "checked=\"checked\"";

    return string.Empty;
}    

SelectAsset被击中,但它没有在回帖上选择单选按钮,但如果我只是刷新页面,它确实有效。我在这里做错了什么?

在这里回答:刷新后如何显示“选定的单选按钮”?说不可能实现,真的是这样吗?

谢谢

更新

如果简单控件没有 runat 属性,则视图状态似乎不可用。我已经通过使用自定义 GroupRadioButton 控件解决了这个问题。感谢您的帮助。

4

2 回答 2

3

我建议使用 RadioButtonList:

页面代码

<asp:RadioButtonList RepeatLayout="UnorderedList" OnSelectedIndexChanged="IndexChanged" AutoPostBack="true" ID="RadioRepeater" runat="server" />

<asp:Label ID="SelectedRadioLabel" runat="server" />

代码背后

if (!Page.IsPostBack)
{
    /* example adds items manually 
        - you could iterate your datasource here as well */
    this.RadioRepeater.Items.Add(new ListItem("Foo"));
    this.RadioRepeater.Items.Add(new ListItem("Bar"));
    this.RadioRepeater.Items.Add(new ListItem("Baz"));

    this.RadioRepeater.SelectedIndex = this.RadioRepeater.Items.IndexOf(new ListItem("Bar"));
    this.RadioRepeater.DataBind();
}

protected void IndexChanged(object sender, EventArgs e)
{
    this.SelectedRadioLabel.Text = string.Format("Selected Item Text: {0}", this.RadioRepeater.SelectedItem.Text);
}

我假设您只需要选择一项。


如评论中所述,它甚至可以访问事件处理程序SelectedItem中的:Page_Load

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // previous code omitted
    }
    else
    {
        string foo = this.RadioRepeater.SelectedItem.Text;
    }
}
于 2012-05-02T13:01:08.537 回答
1

如果您在运行时动态创建所有控件(直接从代码中),那么情况会有所不同。这是我使用的代码:

页面代码

<form id="form1" runat="server">
</form>

代码背后

    protected void Page_Load(object sender, EventArgs e)
    {
        RadioButtonList rbl = new RadioButtonList();
        rbl.AutoPostBack = true;
        rbl.SelectedIndexChanged += rbl_SelectedIndexChanged;

        rbl.Items.Add("All");

        // generate your dynamic radio buttons here
        for (int i = 0; i<5; i++)
        {
            rbl.Items.Add(string.Format("Dynamic{0}", i));
        }
        form1.Controls.Add(rbl);

        if (!Page.IsPostBack)
        {
            rbl.SelectedValue = "All";
            PopulateTextBox(rbl.SelectedValue);
        }

    }

    void rbl_SelectedIndexChanged(object sender, EventArgs e)
    {
        RadioButtonList foo = (RadioButtonList)sender;
        PopulateTextBox(foo.SelectedValue);
    }

    void PopulateTextBox(string selection)
    {
        TextBox box = new TextBox();
        box.Text = selection;
        form1.Controls.Add(box);
    }
于 2016-08-21T15:29:21.560 回答