簡體   English   中英

添加帶有SelectedValue的動態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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM