Domanda

Sulla mia pagina ho un DropDownList che io popolo con i valori del database da un SqlDataSource (vedi codice qui sotto).

Come posso aggiungere il mio proprio testo o una riga vuota prima i valori?

<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>

Grazie.

P.S. Non si consiglia di utilizzare una SqlDataSource o è meglio per popolare un altro modo?

È stato utile?

Soluzione

Si può semplicemente aggiungere un ListItem all'interno del DropDownList Markup. Tutti i valori del DataSource verranno aggiunti dopo.

<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>

Altri suggerimenti

<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>

E 'facile perdere, in modo da non dimenticare l'attributo AppendDataBoundItems ho aggiunto.

Non ho davvero provato questo, ma sto supponendo che si potrebbe aggiungere un elemento dopo aver binded l'elenco a discesa. Si potrebbe aggiungere questo evento per ogni elenco a discesa vuoi aggiungere la casella vuota.

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

ho risolto modificando il comando select l'aggiunta un'opzione vuota:

        <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>

Saluti !!!

In attuazione rasoio stile mi sembra che questo:

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

E in JavaScript che viene eseguito sul carico ho questo:

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

C'è anche una soluzione più flessibile tramite convalida discreto (per non contare su HTML5):

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

Naturalmente, non v'è un controllo lato server, anche. Non credo che sia una buona idea per far fronte con le classi. Per esempio, tutto quello che vi mostro nella pagina è qualche classe. Questa classe ha diverse proprietà del tipo enumerabili. Sarebbe un incubo per replicare tutte quelle proprietà, ma che li rende annullabili nei qualche classe supplementare come alcuni tra quelli proposti qui su StackOverflow.

Dopo tutto, perché dovrei cambiare il mio logica di business per il bene di alcuni markup specifico? Invece, mi occupo di tutto tramite javascript e qualche modello controlli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top