使用SelectedValue添加动态RadioButtonList

时间:2013-07-07 20:42:46

标签: c# asp.net radiobuttonlist

如果我无法正确地说出问题,请耐心等待。

这是将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(“状态”,“是,否”,“是,否”,“否,是”);

在这种情况下,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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分: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());
}

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