Есть ли способ, чтобы элементы в ASP.NET DropDownList имели либо свой текст, либо значение, привязанное к методу источника, а не к свойству?





Единственный способ сделать это - обработать событие Databinding объекта DropDownList, вызвать метод и самостоятельно установить значения в элементе DropDownList.
Декларативно:
<asp:DropDownList ID = "ddlType" runat = "server" Width = "250px" AppendDataBoundItems = "true" DataSourceID = "dsTypeList" DataTextField = "Description" DataValueField = "ID">
<asp:ListItem Value = "0">All Categories</asp:ListItem>
</asp:DropDownList><br />
<asp:ObjectDataSource ID = "dsTypeList" runat = "server" DataObjectTypeName = "MyType" SelectMethod = "GetList" TypeName = "MyTypeManager">
</asp:ObjectDataSource>
Вышеупомянутое привязывается к методу, который возвращает общий список, но вы также можете привязаться к методу, возвращающему DataReader. Вы также можете создать свой источник данных в коде.
Это мое решение:
<asp:DropDownList ID = "dropDownList" runat = "server" DataSourceID = "dataSource" DataValueField = "DataValueField" DataTextField = "DataTextField" />
<asp:ObjectDataSource ID = "dataSource" runat = "server" SelectMethod = "SelectForDataSource" TypeName = "CategoryDao" />
public IEnumerable<object> SelectForDataSource()
{
return _repository.Search().Select(x => new{
DataValueField = x.CategoryId,
DataTextField = x.ToString() // Here is the trick!
}).Cast<object>();
}
Иногда мне нужно использовать свойства навигации как DataTextField, например ("User.Address.Description"), поэтому я решил создать простой элемент управления, производный от DropDownList. Я также реализовал событие ItemDataBound, которое тоже может помочь.
public class RTIDropDownList : DropDownList
{
public delegate void ItemDataBoundDelegate( ListItem item, object dataRow );
[Description( "ItemDataBound Event" )]
public event ItemDataBoundDelegate ItemDataBound;
protected override void PerformDataBinding( IEnumerable dataSource )
{
if ( dataSource != null )
{
if ( !AppendDataBoundItems )
this.Items.Clear();
IEnumerator e = dataSource.GetEnumerator();
while ( e.MoveNext() )
{
object row = e.Current;
var item = new ListItem( DataBinder.Eval( row, DataTextField, DataTextFormatString ).ToString(), DataBinder.Eval( row, DataValueField ).ToString() );
this.Items.Add( item );
if ( ItemDataBound != null ) //
ItemDataBound( item, row );
}
}
}
}
Вот 2 примера привязки раскрывающегося списка в ASP.net из класса
Ваша страница aspx
<asp:DropDownList ID = "DropDownListJour1" runat = "server">
</asp:DropDownList>
<br />
<asp:DropDownList ID = "DropDownListJour2" runat = "server">
</asp:DropDownList>
Ваша страница aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
//Exemple with value different same as text (dropdown)
DropDownListJour1.DataSource = jour.ListSameValueText();
DropDownListJour1.DataBind();
//Exemple with value different of text (dropdown)
DropDownListJour2.DataSource = jour.ListDifferentValueText();
DropDownListJour2.DataValueField = "Key";
DropDownListJour2.DataTextField = "Value";
DropDownListJour2.DataBind();
}
Ваш курс jour.cs (jour.cs)
public class jour
{
public static string[] ListSameValueText()
{
string[] myarray = {"a","b","c","d","e"} ;
return myarray;
}
public static Dictionary<int, string> ListDifferentValueText()
{
var joursem2 = new Dictionary<int, string>();
joursem2.Add(1, "Lundi");
joursem2.Add(2, "Mardi");
joursem2.Add(3, "Mercredi");
joursem2.Add(4, "Jeudi");
joursem2.Add(5, "Vendredi");
return joursem2;
}
}
Очень полезно, один из немногих ответов, которые я смог найти, которые показывают, как установить DataTextField и DataValueField.
В вашем примере DataTextField и DataValueField являются свойствами. Мне нужно, чтобы результатом вызова метода в источнике был текст или значение.