2009-06-11 6 views
29

Nella mia pagina ho un DropDownList che compilo con i valori del database da un SqlDataSource (vedi codice sotto).asp.net dropdownlist - aggiungi riga vuota prima dei valori db

Come posso aggiungere il mio testo o una riga vuota prima dei 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. Ti consiglia di utilizzare un SqlDataSource o è meglio popolare in un altro modo?

+0

Questo si riferisce a: http://stackoverflow.com/questions/267064/asp-net-add-blank-item-at-top-of-dropdownlist – mcfea

risposta

50

È possibile semplicemente aggiungere uno ListItem all'interno del markup DropDownList. Successivamente verranno aggiunti tutti i valori di DataSource.

<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

Devi dirgli di "aggiungere" anziché "sostituire" ' –

+0

Come hai detto, è facile non vederlo :-) –

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> 

È facile non vederlo, quindi non dimenticare l'attributo AppendDataBoundItems che ho aggiunto.

6

Non ho davvero provato questo, ma sto supponendo che si potrebbe aggiungere un elemento dopo aver binded l'elenco a discesa. Puoi aggiungere questo evento a qualsiasi elenco a discesa a cui desideri aggiungere questa casella vuota.

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

Justin - il problema con questo modo di aggiungere la linea è che è ancora selezionabile. Se viene aggiunta una riga vuota per la separazione, non dovrebbe essere selezionabile dall'utente. –

2

ho risolvere cambiando 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 !!!

1

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 discreto convalida (per non contare su HTML5):

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

Naturalmente, c'è un server-sid e controlla anche tu. Non penso sia una buona idea affrontare le lezioni. Ad esempio, tutto ciò che mostro nella pagina è una classe. Questa classe ha diverse proprietà di tipo enumerabili. Sarebbe un incubo replicare tutte quelle proprietà, ma renderle nullable in alcune classi aggiuntive come alcune suggerite qui su StackOverflow.

Dopo tutto, perché dovrei cambiare la mia logica di business per motivi di markup specifico? Invece, mi occupo di tutto tramite javascript e alcuni controlli del modello.