Я создал вспомогательную функцию для выпадающего списка Bind в 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 в функцию, выпадающее меню должно быть привязано по элементу List of issuetype, вы можете увидеть свойства Emetype в коде.
Но, тем не менее, я не могу правильно настроить DataValueField и DataTextField. Каждый раз, когда он говорит, что индекс выходит за пределы диапазона.
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
. Но это не имеет значения, если вы исправите свой код.
На самом деле в коде нет 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);
}
Необходимо указать поля ключа и значения. В вашем случае вы добавляете один элемент в список, но пытаетесь получить доступ ко второму (несуществующему) элементу при попытке указать значение: Convert.ToString(obj[1])
.
Вместо этого вы, скорее всего, захотите:
DDL.DataValueField = "IssuetypeId";
DDL.DataTextField = "Issue";