我在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。每次它都说索引超出范围。
答案 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)
DataValueField
和DataTextField
应该是集合中字段的名称,而不是集合中的值。
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";