0

質問を適切に表現できない場合は、ご容赦ください。

これは、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) は複数の選択肢を持つことができるため、CheckBoxList を RadioButtonList に置き換えるときに、誤って 2 つの選択された値を RadioButtonList に渡してしまいました。予想外の結果をもたらしました。

好奇心から、何が起こるかを確認するために、意図的に 2 つの値を選択項目として渡しました。

RadioButtonList r = GetRadioButtonList("ステータス", "はい、いいえ"、"はい、いいえ"、"いいえ、はい" );

この場合、item.selected は 2 回呼び出されます。選択されたアイテムは、最後に選択されたアイテム、つまり「はい」であるべきだと思います。

デバッグ時、選択項目は「はい」で、これが最後の項目です。けっこうだ!

これでブラウザでページを表示すると「いいえ」と表示されるようになりました。

デバッグと実際の出力の違いの原因は何ですか?

編集

さらに調査して、何が起こるかを確認するために 3 つの値を渡しました...

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;
            }
        }
    }
}
4

1 に答える 1

1

RadioButtonList複数選択をサポートしていませんが、選択項目として「いいえ、はい」を指定します。最後の項目 (「はい」) のみを選択する場合:

RadioButtonList r = GetRadioButtonList("Status", "Yes, No", "Yes, No", "Yes");

RadioButtonList関数を使用して、単一選択のみをサポートする を返しています。しかし、選択した 2 つの値を割り当てています。なぜ「間違った」アイテムが選択されたのか疑問に思っていますか?なんで?

Item.selectedが 2 回呼び出されますが、2 つの値が割り当てられるわけではありません。値は 2 回割り当てられます。では、最後に割り当てられた値がブラウザーに表示されないのはなぜでしょうか?

実際には、最後のアイテム選択されます。最後に追加したアイテムですListItemCollection。選択したアイテムの順序は明らかに重要ではありません。これは、html をレンダリングするブラウザーの実装の詳細にすぎないと思います。選択した 2 つの項目の順序を逆にすると (または 2 つが無効であるため、1 つを削除するだけで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());
}

これにより、アイテムの選択も正しく解除されます。

于 2013-07-07T20:56:01.440 に答える