2009-06-11 9 views
29

Auf meiner Seite Werte habe ich ein DropDownList, die ich mit Datenbankwerten von einem SqlDataSource bevölkern (siehe Code unten).asp.net Dropdownlist - leere Zeile hinzufügen, bevor db

Wie kann ich meine eigenen Text oder eine Leerzeile vor den Werten hinzufü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> 

Danke.

P.S. Empfehlen Sie einen SqlDataSource mit oder ist es besser, einen anderen Weg zu bevölkern?

+0

Das bezieht sich auf: http://stackoverflow.com/questions/267064/asp-net-add-blank-item-at-top-of-dropdownlist – mcfea

Antwort

50

können Sie einfach eine ListItem in der Dropdown Markup hinzufügen. 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> 
+6

Sie müssen es sagen, "append" anstelle von "ersetzen" ' –

+0

Wie du schon sagtest, es ist leicht zu verpassen :-) –

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 ist leicht zu verpassen, also vergessen Sie nicht das AppendDataBoundItems Attribut, das ich hinzugefügt habe.

6

Ich habe nicht wirklich diese getestet, aber ich gehe davon aus, dass Sie ein Element hinzufügen könnte, nachdem Sie die die Dropdown-Liste binded haben. Sie können dieses Ereignis zu jeder Dropdown-Liste hinzufügen, 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); 
    } 
+2

Justin - das Problem mit dieser Art des Hinzufügens der Linie ist, dass es noch wählbar ist. Wenn eine Leerzeile zur Trennung hinzugefügt wird, sollte sie vom Benutzer nicht ausgewählt werden können. –

2

Ich löse den Befehl select Ändern eine leere Option hinzufügen:

 <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 !!! bei mir

1

In rasiermesser Stil Implementierung sieht es dies wie:

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

Und in Javascript, die auf Last ausgeführt wird, ich habe dies:

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

Es gibt auch flexiblere Lösung über unauffällige Validierung (nicht auf HTML5 zählen):

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

Natürlich gibt es eine Server-SID e check auch. Ich glaube nicht, es ist eine gute Idee, mit Klassen zu bewältigen. Zum Beispiel alles, was ich in der Seite zeigen einige Klasse. Diese Klasse hat mehrere aufzählbare Typeneigenschaften. Es wäre ein Albtraum, all diese Eigenschaften zu replizieren, aber in einigen zusätzlichen Klassen als NULL-Werte zu definieren, wie einige hier im Stackoverflow vorgeschlagen haben.

Schließlich, warum sollte ich meine Geschäftslogik für eine bestimmte Markup ändern? Stattdessen behandle ich alles über Javascript und einige Modellprüfungen.