31 Stimmen

asp.net Dropdownliste - Leerzeile vor db-Werten hinzufügen

Auf meiner Seite habe ich eine DropDownList die ich mit Datenbankwerten aus einer SqlDataSource (siehe Code unten).

Wie kann ich meinen eigenen Text oder eine Leerzeile vor den Werten einfügen?

<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. Empfehlen Sie die Verwendung eines SqlDataSource oder ist es besser, auf andere Weise zu bevölkern?

55voto

Jose Basilio Punkte 49489

Sie können einfach eine ListItem innerhalb des DropDownList Markup. Alle Werte aus der DataSource werden danach angehängt.

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

21voto

Joel Coehoorn Punkte 377088
<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 ist leicht zu übersehen, also vergessen Sie nicht die AppendDataBoundItems Attribut hinzugefügt.

6voto

Justin Balvanz Punkte 1186

Ich habe dies nicht wirklich getestet, aber ich nehme an, dass Sie ein Element hinzufügen können, nachdem Sie die Dropdown-Liste gebunden haben. Sie könnten dieses Ereignis zu jeder Dropdown-Liste hinzufügen, zu der Sie dieses leere Feld hinzufügen möchten.

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

2voto

Aldo Punkte 21

Ich löse die Änderung des Auswahlbefehls durch Hinzufügen einer leeren Option:

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

Grüße!!!

1voto

Alexander Punkte 881

In der rasiermesserscharfen Umsetzung sieht das bei mir so aus:

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

Und in javascript, das beim Laden ausgeführt wird, habe ich dies:

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

Es gibt auch eine flexiblere Lösung über unaufdringliche Validierung (nicht auf HTML5 zu zählen):

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

Natürlich gibt es auch eine serverseitige Prüfung. Ich glaube nicht, dass es eine gute Idee ist, mit Klassen umzugehen. Zum Beispiel ist alles, was ich auf der Seite zeige, eine Klasse. Diese Klasse hat mehrere aufzählbare Typeneigenschaften. Es wäre ein Albtraum, all diese Eigenschaften zu replizieren, aber sie in einer zusätzlichen Klasse nullbar zu machen, wie einige hier auf Stackoverflow vorgeschlagen haben.

Warum sollte ich schließlich meine Geschäftslogik zugunsten eines bestimmten Markups ändern? Stattdessen erledige ich alles über Javascript und einige Modellprüfungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X