首先有關於此的問題(DropDownList has a SelectedValue which is invalid because it does not exist in the list of items,DropDownList "has a SelectedValue which is invalid because it does not exist in the list of items",asp:DropDownList Error: 'DropDownList1' has a SelectedValue which is invalid because it does not exist in the list of items),並且提出了一些解決方法,但我的問題是真的爲什麼發生這種情況。我對建議的解決方法並不滿意,而且我覺得它們相當難看。ASP.NET Web窗體DropDownList有一個無效的SelectedValue,因爲它不存在於項目列表中
因此,有一個下拉列表和一個按鈕的頁面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="TestWebApplication.WebForm2" ViewStateMode="Disabled" %>
<html lang="en" >
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="ddlTest" runat="server">
</asp:DropDownList>
<asp:Button Text="Test" ID="btnTest" runat="server" onclick="btnTest_Click" />
</div>
</form>
</body>
</html>
我綁定ddlTest與Page_Init一些項目,然後在btnTest_Click我再次綁定:
using System;
namespace TestWebApplication
{
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = new[] { 1, 2, 3 };
ddlTest.DataBind();
ddlTest.SelectedValue = "3";
}
protected void btnTest_Click(object sender, EventArgs e)
{
//SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
ddlTest.ClearSelection();
//SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
ddlTest.SelectedIndex = -1; //Nothing changes including SelectedIndex
ddlTest.SelectedValue = ""; //Nothing changes including SelectedValue
ddlTest.Items.Clear();
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = null; //Nothing changes except for the DataSource property
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
}
}
}
爲什麼我明白了。我嘗試了這些不同的版本,但都沒有成功。我試着只使用ClearSelection,但仍然得到相同的異常。這是控制中的錯誤還是我錯過的東西。其他問題的難題解決方法是唯一的解決方案嗎?
注意 - 即使按鈕被移除並且所有代碼都在單個事件處理程序中移動,該錯誤仍可以重現。只需綁定一次設置選定的值並重新綁定即可。
我不確定你到底在看什麼,但我不明白你爲什麼要採取這種方法。首先,我會創建一個單獨的方法來初始化控件。然後,如果'!IsPostBack',我會從'Page_Load'調用這個方法。然後,我會在做出任何更改後再次從您的按鈕點擊處理程序中調用相同的方法。你有什麼理由爲什麼使用'Page_Init'事件? – 2011-05-04 16:01:28
@J。 Wood +1來推薦Page_Load,而不是Page_Init。頁面生命週期可能非常令人沮喪,如果可能的話,最好儘量避免在其深處使用。 – Didaxis 2011-05-04 16:11:00
這可能是因爲他試圖避免污染ddl的視圖狀態......他顯然不想在這裏完成任何事情,這只是一個演示來演示錯誤狀態。 – pseudocoder 2011-05-04 17:00:32