質問を適切に表現できない場合は、ご容赦ください。
これは、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;
}
}
}
}