2016-12-13 105 views
0

我在DataBind()上收到此错误,但我不知道为什么不应该有任何选择。Dropdown有一个无效的SelectedValue,因为它不存在于项目列表中,即使我清除了选定的项目(C#)

DdState.Items.Clear(); 
DdState.DataSource = UsStates; 
DdState.DataTextField = "Title"; 
DdState.DataValueField = "Title";   
DdState.Items.Insert(0, String.Empty); 
if (DdState.SelectedItem != null) 
{ 
    DdState.SelectedItem.Selected = false; 
} 
DdState.DataBind(); 

private IEnumerable<IStateItem> UsStates 
{ 
    get 
    { 
     var statesFolder = _sitecoreService.GetItem<ISitecoreItem>(ItemReference.BcsUs_ProductData_States.Guid); 
     if (statesFolder == null) 
      return new List<IStateItem>(); 

     List<IStateItem> usStates = _sitecoreService.QueryChildren<IStateItem>(statesFolder).OrderBy(s => s.Title).ToList(); 
     return usStates; 
    } 
} 

我试图把在DdState.SelectedIndex = 0的的DataBind()之前,但后来我所选择的指数是不存在的错误。这是怎么回事?

+0

在哪里,当你绑定数据到DropDownList的? – VDWWD

回答

0

您的IStateItem类可能有问题吗? 我复制/粘贴你的代码在一个新的asp.net应用程序,做了我自己的IStateItem类,它的工作原理。

using System; 
using System.Collections.Generic; 

namespace TestIt 
{ 
    public partial class Form1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      FillTheList(); 
     } 

     private void FillTheList() 
     { 
      ddl_TheList.Items.Clear(); 
      ddl_TheList.DataSource = UsStates; 
      ddl_TheList.DataTextField = "statename"; 
      ddl_TheList.DataValueField = "stateStatus"; 
      //ddl_TheList.Items.Insert(0, String.Empty); 
      ddl_TheList.DataBind(); 
      ddl_TheList.SelectedIndex = 0; 
     } 

     private IEnumerable<IStateItem> UsStates 
     { 
      get 
      { 
       List<IStateItem> usStates = new List<IStateItem>(); 
       for (int i = 0; i < 10; i++) 
       { 
        usStates.Add(new IStateItem { statename = "state #" + i, stateStatus = "cool state bro" }); 
       } 
       return usStates; 
      } 
     } 
    } 

    public class IStateItem 
    { 
     public string statename { get; set; } 
     public string stateStatus { get; set; } 
    } 


} 
1

如果数据源是一个列表其更容易实现。所以只需将UsStates IEnumerable“转换”为List,然后将其添加到数据源。

DdState.DataSource = UsStates.ToList();

然后选择列表项的属性具有约束力。

OR

public Form1() 
    { 

     InitializeComponent(); 

     DdState.Items.Clear(); 
     DdState.DataSource = UsStates; 
     DdState.DisplayMember = "Statename"; 
     DdState.SelectedIndex = 0; 
    } 

    private List<IStateItem> UsStates 
    { 
     get 
     { 

      List<IStateItem> usStates = new List<IStateItem>(); 

      usStates.Add(new IStateItem("California","status1")); 
      usStates.Add(new IStateItem("Ohio", "status3")); 
      return usStates; 
     } 
    } 

    private class IStateItem 
    { 
     public IStateItem(string statename, string stateStatus) 
     { 
      Statename = statename; 
      StateStatus = stateStatus; 
     } 
     public string Statename { get; set; } 
     public string StateStatus { get; set; } 
    } 
+0

我不是“只是”将IEnumerable转换为我的代码片段中的列表,而我的代码段工作正常。因此,他/她“不需要转换”IEnumerable就可以工作。 –

+0

在我自己的项目上有效。所以我认为它在这里同样的事情。也许我错了。 –

+0

它适用于两种方式。它适用于如果您使用IEnumerable,并且它在您使用List <>时工作。因此,为什么我认为他/她列举/列举的课程中有什么错误。您的代码片段中包含的课程是我提出的课程,因为他/她提供的代码不包含课程。所以我做了一个。 –

相关问题