2011-05-04 86 views
15

首先有關於此的問題(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,但仍然得到相同的異常。這是控制中的錯誤還是我錯過的東西。其他問題的難題解決方法是唯一的解決方案嗎?

注意 - 即使按鈕被移除並且所有代碼都在單個事件處理程序中移動,該錯誤仍可以重現。只需綁定一次設置選定的值並重新綁定即可。

+1

我不確定你到底在看什麼,但我不明白你爲什麼要採取這種方法。首先,我會創建一個單獨的方法來初始化控件。然後,如果'!IsPostBack',我會從'Page_Load'調用這個方法。然後,我會在做出任何更改後再次從您的按鈕點擊處理程序中調用相同的方法。你有什麼理由爲什麼使用'Page_Init'事件? – 2011-05-04 16:01:28

+0

@J。 Wood +1來推薦Page_Load,而不是Page_Init。頁面生命週期可能非常令人沮喪,如果可能的話,最好儘量避免在其深處使用。 – Didaxis 2011-05-04 16:11:00

+1

這可能是因爲他試圖避免污染ddl的視圖狀態......他顯然不想在這裏完成任何事情,這只是一個演示來演示錯誤狀態。 – pseudocoder 2011-05-04 17:00:32

回答

30

我已經提交了關於Connect的問題。它被解析爲「無法修復」,這在我看來意味着它實際上是一個錯誤。一種解決方法是提供:

ddlTest.Items.Clear(); 
ddlTest.SelectedValue = null; 

https://connect.microsoft.com/VisualStudio/feedback/details/666808/asp-net-dropdownlist-selectedvalue-is-persisted-which-results-in-exception-if-the-control-is-databound-second-time

我有種考慮這個問題的答案。

+2

謝謝,先生。更多證據表明我並不瘋狂。 – 2012-01-05 20:24:54

+0

太棒了。 2個小時的谷歌搜索和調試...然後我找到了這個。我已經嘗試將selectedindex設置爲-1,將.AppendDataBoundItems設置爲true,並在將項目放入之前進行綁定。這些方法均無效。這樣做了! – sacredfaith 2012-06-26 14:10:09

+0

我確認這是唯一有效的答案。我試着SelectedIndex = -1,它沒有工作。我想知道爲什麼,因爲SelectedValue = null SelectedIndex = -1,ClearSelection()和Item.Selected = false都應該是同義詞。我的應用程序正在從NET11遷移到NET4。在NET11中,這個錯誤沒有發生。 – 2015-06-10 18:19:55

2

1)正如您所寫的,您的示例實際上在ddlTest.SelectedValue = "";上引發異常,因爲該集合中沒有包含「」的Value的項目。我認爲在任何情況下都會有這種情況。

2)每當我嘗試將DDL的SelectedValueSelectedIndex設置爲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的內容可能在同一頁面週期內改變之前,設置DDL的SelectedIndexSelectedValue屬性。如果之前設置的值在DropDownList.Items的新內容中仍然可用,則表明您正在進行業務。但如果它不在那裏,你會得到一個例外。

我的猜測是這與線程安全有關,但我不是那方面的專家,所以希望有人可以發表評論。

+0

奇怪的是,它會爲您另一行拋出異常。你正在測試什麼版本的ASP.NET? – Stilgar 2011-05-05 06:44:18

+0

VS 4中的.NET 4 ... – pseudocoder 2011-05-05 15:18:39

3

爲什麼我會得到異常。

Page_Init()被調用後,ddlTest被綁定到3項:「1」,「2」和「3」。然後,將SelectedValue設置爲「3」,並處理與DropDownList控件相關的各種事物。 但是該控件仍然綁定到之前的列表 - 即使您已更改DropDownList屬性,也沒有再次調用.DataBind()。發生異常是因爲控件仍然綁定到{1,2,3},它會掛在以前的.SelectedValue上,而您剛剛嘗試過。DataBind()它到一個不包含「3」的列表。

+2

那麼,如果我無法更改SelectedValue屬性,那麼如何綁定到不包含3的列表?它看起來像Catch 22. – Stilgar 2011-05-08 15:58:17

+0

你確實可以改變它,但是你需要在第一次調用.DataBind()之前做所有的改變。我在兩個地方(錯誤地)更改.SelectedValue時遇到了同樣的問題。在.DataBind()之後做一個調用,你應該是金手指。 +1爲約瑟夫海勒。 – 2011-05-09 21:36:09

3

我有一個類似的問題,並通過添加DataBinding方法修復它。

protected void myDDL_DataBinding(object sender, EventArgs e) 
{ 
    if (myDDL.SelectedIndex != -1) 
    { 
     myDDL.SelectedIndex = 0; 
    } 
} 

在設計網頁...

<asp:DropDownList ID="myDDL" runat="server" 
    AutoPostBack="true" OnDataBinding="myDDL_DataBinding" 
    OnSelectedIndexChanged="myDDL_SelectedIndexChanged"> 
</asp:DropDownList> 
-2

因爲沒有當你的頁面重新加載(回發發生),你應該甚至在刷新頁面在.aspx文件中添加SqlDataSource控件任何數據源識別DropDownList的數據源。然後,您可以使用InsertCommand,UpdateCommand,DeleteCommand和SelecCommand來獲取您的數據庫。

0

在我的情況下,我有DropdownListtemplatedfieldgridview。現在datasource的網格有employeeid項目。我在存儲過程中使用了isnull(employeeid,0)作爲數據源,並且猜測DropdownList的項目上沒有值0;所以我把它改爲isnull(employeeid,1),因爲DropdownList中的第一項有employeeid =1,這個問題解決了

相關問題