如果我无法正确表达问题,请多多包涵。
这是将 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;
}
}
}
}