1) Как написано, ваш пример фактически генерирует исключение для ddlTest.SelectedValue = "";
, поскольку в коллекции нет элемента с Value
, равным "". Я думаю, что этого следовало ожидать при любых обстоятельствах.
2) Я получаю исключение каждый раз, когда пытаюсь установить SelectedValue
или SelectedIndex
для DDL на что-то, что БУДЕТ недействительным к моменту, когда DDL будет обработан. Но исключение не происходит до тех пор, пока коллекция DropDownList.Items
не изменится, например, с DropDownList.Databind()
. Первое, что я сделал, это изменил Page_Init:
protected void Page_Init(object sender, EventArgs e)
{
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
if (!IsPostBack)
{
ddlTest.DataSource = new[] { 1, 2, 3 };
ddlTest.DataBind();
ddlTest.SelectedValue = "3";
}
}
Теперь то, что становится интересным, это первый пример, который выдает исключение, а второй - нет. Они оба устанавливают SelectedValue
, который действителен в то время, но значение в первом примере («3») не будет действительным ко времени рендеринга страницы:
protected void btnTest_Click(object sender, EventArgs e)
{
//SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
ddlTest.SelectedValue = "3";
//SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
ddlTest.ClearSelection();
//SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
ddlTest.Items.Clear();
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = null;
ddlTest.DataSource = new[] { 1, 2 };
ddlTest.DataBind(); //Exception!
//'ddlTest' has a SelectedValue which is invalid because it does not exist in the list of items.
//Parameter name: value
}
protected void btnTest_Click(object sender, EventArgs e)
{
//SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3} (from viewstate)
ddlTest.SelectedValue = "2";
//SelectedIndex is 1, SelectedValue is "2", SelectedItem is {3}
ddlTest.ClearSelection();
//SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
ddlTest.Items.Clear();
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = null;
ddlTest.DataSource = new[] { 1, 2 };
ddlTest.DataBind(); //No Exception...
}
Итак, какой вывод мы можем из этого сделать? Что ж, похоже, проблема связана с установкой свойства DDL SelectedIndex
или SelectedValue
до того, как содержимое DDL может быть изменено в одном и том же цикле страницы. Если ранее установленное значение все еще доступно в новом содержимом DropDownList.Items
, вы в деле. Но если его там нет, вы получите исключение.
Полагаю, это как-то связано с безопасностью потоков, но я не специалист по этому вопросу, так что, надеюсь, кто-то может прокомментировать.