web-dev-qa-db-fra.com

liste déroulante asp.net - ajouter une ligne vide avant les valeurs db

Sur ma page, j'ai un DropDownList que je remplis avec des valeurs de base de données à partir d'un SqlDataSource (voir le code ci-dessous).

Comment puis-je ajouter mon propre texte ou une ligne vide avant les valeurs?

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

Merci.

P.S. Recommandez-vous d'utiliser un SqlDataSource ou est-il préférable de remplir une autre manière?

31
thegunner

Vous pouvez simplement ajouter un ListItem à l'intérieur du balisage DropDownList. Toutes les valeurs du DataSource seront ajoutées après cela.

<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>
52
Jose Basilio
<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>

C'est facile à manquer, alors n'oubliez pas l'attribut AppendDataBoundItems que j'ai ajouté.

21
Joel Coehoorn

Je n'ai pas vraiment testé cela, mais je suppose que vous pouvez ajouter un élément après avoir lié la liste déroulante. Vous pouvez ajouter cet événement à n'importe quelle liste déroulante à laquelle vous souhaitez ajouter cette boîte vide.

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

Je résous en changeant la commande select en ajoutant une option vide:

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

Salutations!!!

2
Aldo

Dans l'implémentation de style rasoir chez moi, cela ressemble à ceci:

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

Et en javascript qui est exécuté à la charge, j'ai ceci:

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

Il existe également une solution plus flexible via une validation discrète (sans compter sur HTML5):

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

Bien sûr, il y a aussi une vérification côté serveur. Je ne pense pas que ce soit une bonne idée de faire face aux cours. Par exemple, tout ce que je montre dans la page est une classe. Cette classe possède plusieurs propriétés de type énumérables. Ce serait un cauchemar de répliquer toutes ces propriétés, mais de les rendre nullables dans une classe supplémentaire comme certaines suggérées ici sur stackoverflow.

Après tout, pourquoi devrais-je changer ma logique métier pour des raisons de balisage spécifique? Au lieu de cela, je gère tout via javascript et quelques vérifications de modèle.

1
Alexander