2009-06-11 14 views
29

En mi página tengo un DropDownList que puebla con valores de base de datos de SqlDataSource (vea el código a continuación).lista desplegable de asp.net - agregue la línea en blanco antes de los valores db

¿Cómo puedo agregar mi propio texto o una línea en blanco antes de los valores?

<asp:DropDownList ID="drpClient" runat="server" Width="200px" 
    AutoPostBack="True" DataSourceID="dsClients" DataTextField="name" 
     DataValueField="client_id"> 
</asp:DropDownList> 
<asp:SqlDataSource ID="dsClients" runat="server" 
    ConnectionString="my_connection_string" 
    ProviderName="System.Data.SqlClient" 
    SelectCommand="SELECT [client_id], [name] FROM [clients]"> 
</asp:SqlDataSource> 

Gracias.

P.S. ¿Recomiendas usar SqlDataSource o es mejor poblar de otra manera?

+0

Esto se relaciona con: http://stackoverflow.com/questions/267064/asp-net-add-blank-item-at-top-of-dropdownlist – mcfea

Respuesta

50

Puede simplemente agregar un ListItem dentro de la marca de DropDownList. Todos los valores de DataSource se agregarán después de eso.

<asp:DropDownList ID="drpClient" runat="server" Width="200px" 
      AutoPostBack="True" DataSourceID="dsClients" DataTextField="name" 
      DataValueField="client_id" AppendDataBoundItems="true"> 
    <asp:ListItem>-- pick one --</asp:ListItem> 
</asp:DropDownList> 
+6

Tiene que decirle 'anexar' en lugar de 'reemplazar' ' –

+0

Como dijiste, es fácil pasar por alto :-) –

20
<asp:DropDownList ID="drpClient" runat="server" Width="200px" 
     AutoPostBack="True" DataSourceID="dsClients" DataTextField="name" 
     DataValueField="client_id" AppendDataBoundItems="True"> 

    <asp:ListItem Text="" Value="" /> 
</asp:DropDownList> 

Es fácil pasar por alto, así que no olvide el atributo AppendDataBoundItems que agregué.

6

realmente no he probado esto, pero estoy asumiendo que usted podría agregar un elemento después de haber binded la lista del menú desplegable. Puede agregar este evento a cualquier lista desplegable a la que le gustaría agregar este cuadro vacío.

protected void DropDownList_DataBound(object sender, EventArgs e) 
    { 
     DropDownList ddl = (DropDownList)sender; 
     ListItem emptyItem = new ListItem("", ""); 
     ddl.Items.Insert(0, emptyItem); 
    } 
+2

Justin: el problema con esta forma de agregar la línea es que todavía es seleccionable. Si se agrega una línea en blanco para la separación, no debe ser seleccionable por el usuario. –

2

que resuelve el cambio de la instrucción de selección añadiendo una opción vacío:

 <asp:SqlDataSource ID="dsClients" runat="server" 
      ConnectionString="my_connection_string" 
      ProviderName="System.Data.SqlClient" 
      SelectCommand="SELECT [client_id], [name] FROM [clients] union SELECT NULL, '--- pick one ----' "> 
     </asp:SqlDataSource> 

Saludos !!!

1

En aplicación de estilo de afeitar me parece que esto:

@Html.EnumDropDownListFor(
    model => model.Privilege.Role, 
    "-- Select role --", 
    new 
    { 
     @style = "width: 216px !important", 
     @class = "form-control", 
     id = "role", 
     required = "required" 
    }) 

Y en JavaScript que se ejecuta en la carga que tienen la siguiente:

function PutDefaultPrivilegePanelListHints() { 
    $('#role').val(''); 
    ... 
} 

Existe también una solución más flexible a través discreta validación (no contar con HTML5):

$('.required').each(function() { $(this).rules('add', { required: true, messages: { required: '' } }) }); 

Por supuesto, hay un servidor-sid e control, también. No creo que sea una buena idea lidiar con las clases. Por ejemplo, todo lo que muestro en la página es de alguna clase. Esta clase tiene varias propiedades de tipo enumerable. Sería una pesadilla replicar todas esas propiedades, pero haciéndolas anulables en alguna clase adicional como algunas sugeridas aquí en stackoverflow.

Después de todo, ¿por qué debería cambiar mi lógica comercial por el bien de un marcado específico? En cambio, trato con todo a través de javascript y algunas verificaciones de modelo.

Cuestiones relacionadas