![](/img/trans.png)
[英]How to get SelectedValue from array of dynamic RadioButtonList?
[英]Adding Dynamic RadioButtonList with SelectedValue
如果我無法正確表達問題,請忍受。
這是將代碼動態添加到表格的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”,“ 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
多虧了Tim的回答,我終於有了這個功能。
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());
}
這也會正確取消選擇項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.