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

本文关键字:字段 数据 asp Dropdownlist 文本 绑定 | 更新日期: 2023-09-27 18:26:04

我已经创建了一个助手函数来绑定asp.net中的下拉列表。查看我的功能:

  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实体的List绑定,你可以在代码中看到Issuetype的属性。

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

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

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

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

引发异常是因为在您的集合中有1个项,但您试图将第二个项(不存在)放在DataTextField中。但是,如果您修复了代码,这就不相关了。

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

你可能想要的是:

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

实际上,您的代码中没有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);
}