【问题标题】:Adding Dynamic RadioButtonList with SelectedValue使用 SelectedValue 添加动态 RadioButtonList
【发布时间】:2013-07-08 06:37:33
【问题描述】:

如果我无法正确表达问题,请多多包涵。

这是将 ListControl (RadioButtonList) 动态添加到表单的代码:

protected void Page_Load(object sender, EventArgs e)
{
    RadioButtonList r = GetRadioButtonList("Status", "Yes, No", "Yes, No", "No, Yes");
    form1.Controls.Add(r);
}

private RadioButtonList GetRadioButtonList(string id, string keys, string values, string selectedValues)
{
    RadioButtonList list = new RadioButtonList();
    list.ID = id;
    AddListItems(list, keys, values, selectedValues);
    return list;
}

private void AddListItems(ListControl control, string keys, string values, string selectedValues)
{
    string[] key = keys.Split(',');
    string[] value = values.Split(',');

    if (key.Count() == value.Count())
    {
        for (int i = 0; i < key.Length; i++)
        {
            ListItem item = new ListItem(key[i].Trim(), value[i].Trim());
            control.Items.Add(item);
        }
    }

    foreach (string selectedValue in selectedValues.Split(','))
    {
        foreach (ListItem item in control.Items)
        {
            if (item.Value.Trim().Equals(selectedValue.Trim()))
            {
                item.Selected = true;
            }
        }
    }
}

我在这里只粘贴了必需的、最少的和可重现的代码。

由于函数 AddListItems 接受 ListControl 并且 CheckBoxList(ListControl) 可以有多个选择,我第一次不小心将两个选择的值传递给 RadioButtonList,当用 RadioButtonList 替换 CheckBoxList 时。它产生了意想不到的结果。

出于好奇,我故意将两个值作为选定项传递,看看会发生什么。

RadioButtonList r = GetRadioButtonList("Status", "Yes, No", "Yes, No", "No, Yes");

在这种情况下,item.selected 将被调用两次。我认为选择的项目应该是最后选择的项目,即“是”。

调试时,选中的项是“是”,也就是最后一项。很公平!

现在,当页面在浏览器中显示时,显示“否”。

是什么导致了调试和实际输出的差异?

编辑

进一步调查,我传递了三个值来检查会发生什么......

RadioButtonList r = GetRadioButtonList("Status", "Yes, No, Maybe", "Yes, No, Maybe", "Yes, No, Maybe");
RadioButtonList r = GetRadioButtonList("Status", "Yes, No, Maybe", "Yes, No, Maybe", "Maybe, No, Yes");
RadioButtonList r = GetRadioButtonList("Status", "Yes, No, Maybe", "Yes, No, Maybe", "No, Yes, Maybe");
RadioButtonList r = GetRadioButtonList("Status", "Yes, No, Maybe", "Yes, No, Maybe", "No, Yes");

无论最后选择哪个项目或以任何顺序选择,RadioButtonList 的选定项目的最后一个项目都将显示为选中。

编辑 2

感谢蒂姆的回答,我最终得到了这个功能。

private void AddListItems(ListControl control, string keys, string values, string selectedValues)
{
    string[] key = keys.Split(',');
    string[] value = values.Split(',');

    if (key.Count() == value.Count())
    {
        for (int i = 0; i < key.Length; i++)
        {
            ListItem item = new ListItem(key[i].Trim(), value[i].Trim());
            control.Items.Add(item);
        }
    }

    foreach (ListItem item in control.Items)
    {
        if (control is CheckBoxList)
        {
            foreach (string selectedValue in selectedValues.Split(','))
            {
                if (item.Value.Trim().Equals(selectedValue.Trim()))
                {
                    item.Selected = true;
                }
            }
        }
        else
        {                
            if (item.Value.Trim().Equals(selectedValues.Split(',').Last().Trim()))
            {
                item.Selected = true;
                break;
            }
        }
    }
}

【问题讨论】:

    标签: c# asp.net radiobuttonlist


    【解决方案1】:

    RadioButtonList 不支持多选,但您提供“否,是”作为选定项。如果您只想选择最后一项(“是”):

    RadioButtonList r = GetRadioButtonList("Status", "Yes, No", "Yes, No", "Yes");
    

    您正在使用您的函数返回一个仅支持单选的RadioButtonList。但是您正在分配两个选定的值。现在您想知道为什么选择了“错误”项目。为什么?

    Item.selected 被调用了两次,这并不意味着分配了两个值。该值被分配两次。那么,为什么浏览器中没有显示最后一个赋值呢?

    其实最后一项被选中的,你添加的最后一项是ListItemCollection,显然选中项的顺序并不重要。我认为这只是呈现 html 的浏览器的实现细节。如果您颠倒您选择的两个项目的顺序(或者只删除一个,因为两个对 RadioButtonList 无效),这将是所需的结果。

    这是在 Firefox 中生成的 HTML,你可以看到这两个项目都被“选中”,但实际上只有最后一个被选中:

    <table id="Status">
        <tr>
            <td><input id="Status_0" type="radio" name="Status" value="Yes" checked="checked" /><label for="Status_0">Yes</label></td>
        </tr><tr>
            <td><input id="Status_1" type="radio" name="Status" value="No" checked="checked" /><label for="Status_1">No</label></td>
        </tr>
    </table>
    

    旁注:如果您想选择ListItems,则不需要排除不应选择的项目。

    if 子句不正确:

    foreach (ListItem item in control.Items)
    {
        if (item.Value.Trim().Equals(selectedValue.Trim()))
        {
            item.Selected = true;
        }
    }
    

    正确的代码:

    foreach (ListItem item in control.Items)
    {
        item.Selected = item.Value.Trim().Equals(selectedValue.Trim());
    }
    

    这也会正确取消选择项目。

    【讨论】:

    • 函数 AddListItems 接受 DropDownList、RadioButtonList、CheckBoxList 和任何其他 ListControl。这就是我遍历所有项目的原因。
    • @NickBinnet:我错过了,但是,您将它与RadioButtonList 一起使用。 "sidenote" 部分是真的。
    • 蒂姆。调试器说选定的项目是“是”。 IE 说“不”。只是好奇,为什么?
    • @NickBinnet:同样,您正在使用您的函数返回一个仅支持单选的RadioButtonList。但是您正在分配两个选定的值。现在您想知道为什么选择了“错误”项目。为什么?
    • @NickBinnet:实际上最后一项被选中的,你添加到它的最后一项是ListItemCollection,选中项的顺序显然并不重要。我认为这只是一个实现细节,没有记录。但是,如果您将两个选定项目的顺序颠倒(或者只是删除一个,因为两个对于 RadioButtonList 无效),那将是可以预测的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多