2009-03-24 13 views
6

Estamos vinculando una lista de objetos personalizados a una DropDownList de ASP.NET en C#, pero queremos permitir que DropDownList no tenga nada seleccionado inicialmente. Una forma de hacer esto podría ser crear una lista intermedia de cadenas, rellenar la primera con una cadena vacía y luego llenar el resto de la lista con la información del objeto personalizado.Agregue el elemento vacío a la lista desplegable de objetos personalizados en C#

Esto no parece muy elegante, sin embargo, ¿alguien tiene una mejor sugerencia?

Respuesta

23

Sí, crear su lista de este modo:

<asp:DropDownList ID="Whatever" runat="server" AppendDataBoundItems="True"> 
    <asp:ListItem Value="" Text="Select one..." /> 
</asp:DropDownList> 

(nótese el uso de AppendDataBoundItems="True")

Y luego cuando se enlaza, los elementos unidos se ponen después del elemento vacío en lugar de sustituir eso.

+0

Vaya, qué tarea más simple – Sauron

+0

Simple cuando lo conoce. Gracias Sean. El regalo que sigue dando. :) – BobRodes

11

Se podría añadir al evento de enlace de datos:

protected void DropDownList1_DataBound(object sender, EventArgs e) 
     { 
      DropDownList1.Items.Insert(0,new ListItem("","")); 
     } 
+0

más o menos de la manera en que lo he estado haciendo durante años, o incluso en DataBound pero en cualquier momento después de configurar el DataSource +1 –

2

Sólo trabajando en esta realidad, esto es lo que tengo hasta ahora (junto con unos extras pareja de enlace de datos)

public interface ICanBindToObjectsKeyValuePair { 
    void BindToProperties<TYPE_TO_BIND_TO>(IEnumerable<TYPE_TO_BIND_TO> bindableEnumerable, Expression<Func<TYPE_TO_BIND_TO, object>> textProperty, Expression<Func<TYPE_TO_BIND_TO, object>> valueProperty); 
} 

public class EasyBinderDropDown : DropDownList, ICanBindToObjectsKeyValuePair { 
    public EasyBinderDropDown() { 
     base.AppendDataBoundItems = true; 
    } 
    public void BindToProperties<TYPE_TO_BIND_TO>(IEnumerable<TYPE_TO_BIND_TO> bindableEnumerable, 
     Expression<Func<TYPE_TO_BIND_TO, object>> textProperty, Expression<Func<TYPE_TO_BIND_TO, object>> valueProperty) { 
     if (ShowSelectionPrompt) 
      Items.Add(new ListItem(SelectionPromptText, SelectionPromptValue)); 
     base.DataTextField = textProperty.MemberName(); 
     base.DataValueField = valueProperty.MemberName(); 
     base.DataSource = bindableEnumerable; 
     base.DataBind(); 
    } 
    public bool ShowSelectionPrompt { get; set; } 
    public string SelectionPromptText { get; set; } 
    public string SelectionPromptValue { get; set; } 
    public virtual IEnumerable<ListItem> ListItems { 
     get { return Items.Cast<ListItem>(); } 
    } 
} 

cuenta de una cosa que se que puede hacer es

dropDown.BindToProperties(myCustomers, c=>c.CustomerName, c=>c.Id); 
1

primero:

DropDownList1.Items.Clear();

A continuación, agregue listItems a la dropDownList.

Esto evita que dropDownList adquiera una lista cada vez mayor de elementos cada vez que se representa en una devolución de datos o una devolución de datos asincrónica.

+0

Esto realmente no responde la pregunta, pero +1 porque cuando acabo de comenzar con ASP .NET, necesitaba saber esto mal, jeje :) Me llevó unas horas averiguarlo. – SirDemon

Cuestiones relacionadas