绑定数据文本字段,数据值字段为asp:Dropdownlist

时间:2014-10-10 06:07:35

标签: c# asp.net

我在asp.net中为Bind下拉列表创建了一个辅助函数。 看我的功能:

  public void BindDDL(string query, DropDownList DDL)
    {
        List<Issuetype> obj = new List<Issuetype>();
        Issuetype iss = new Issuetype();
        iss.DeptId = 1;
        iss.Issue = "SSS";
        iss.IssuetypeId = 4;
        obj.Add(iss);
        //BALissue Bl = new BALissue();
        //List<Issuetype> objSource = null;
        //objSource = Bl.Bind_issuetypes(query);
        DDL.DataSource = obj;
        DDL.DataValueField = Convert.ToString(obj[0]);
        DDL.DataTextField = Convert.ToString(obj[1]);
        DDL.DataBind();

    }

这样,如果我将查询名称和Dropdownlist id发送给该函数,下拉列表应该由Issuetype列表实体绑定,您可以在代码中看到Issuetype的属性。

但是我无法正确设置DataValueField和DataTextField。每次它都说索引超出范围。

3 个答案:

答案 0 :(得分:1)

实际上代码中没有obj[1],因为obj列表中只有一个项目,所以

DDL.DataTextField = Convert.ToString(obj[1]);

此行您将获得例外

相反,您可以使用

   DDL.DataValueField = "Issue"; 
   DDL.DataTextField = "IssuetypeId";

要获取属性名称,请使用Reflection

using System.Reflection;  // reflection namespace  
// get all public static properties of MyClass type
PropertyInfo[] propertyInfos;
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Static);
// sort properties by name
Array.Sort(propertyInfos,
        delegate(PropertyInfo propertyInfo1, PropertyInfo propertyInfo2)
        { return propertyInfo1.Name.CompareTo(propertyInfo2.Name); });
// write property names
foreach (PropertyInfo propertyInfo in propertyInfos)
{
  Console.WriteLine(propertyInfo.Name);
}

答案 1 :(得分:1)

DataValueFieldDataTextField应该是集合中字段的名称,而不是集合中的值。

    DDL.DataSource = obj;
    DDL.DataValueField = "Issue"; //example choose what is needed
    DDL.DataTextField = "IssuetypeId"; //example choose what is needed
    DDL.DataBind();

抛出异常,因为在你的收藏中你有1个项目,但你试图在DataTextField中放入第二个项目(不存在)。但是,如果您修复代码,则无关紧要。

答案 2 :(得分:1)

您需要指定键和值字段。在您的情况下,您要添加一个项目列表,但在尝试指定值时尝试访问第二个(不存在的)项目:Convert.ToString(obj[1])

你可能想要的是:

DDL.DataValueField = "IssuetypeId";
DDL.DataTextField = "Issue";