添加具有SelectedValue的动态单选按钮列表
本文关键字:动态 单选按钮 列表 SelectedValue 添加 | 更新日期: 2023-09-27 18:21:18
如果我不能正确地表达这个问题,请耐心等待。
这是将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替换CheckBoxList时,我第一次意外地将两个选定的值传递给RadioButtonList。它产生了意想不到的结果。
出于好奇,我有意将两个值作为选定项目传递,看看会发生什么。
RadioButtonList r=GetRadioButtonList("Status"、"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");
最后选择哪个项目或按任何顺序选择哪个项目都无关紧要,单选按钮列表中所选项目的最后一个项目将显示为已选择。
编辑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;
}
}
}
}
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());
}
这也会正确取消选择项目。