2009-06-11 5 views
29

На моей странице у меня есть DropDownList, который я заполняю значениями базы данных из SqlDataSource (см. Код ниже).asp.net dropdownlist - добавить пустую строку до значений db

Как добавить свой собственный текст или пустую строку до значений?

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

Спасибо.

P.S. Вы рекомендуете использовать SqlDataSource, или лучше ли заполнять другой способ?

+0

Это относится к: http://stackoverflow.com/questions/267064/asp-net-add-blank-item-at-top-of-dropdownlist – mcfea

ответ

50

Вы можете просто добавить ListItem внутри разметки DropDownList. После этого будут добавлены все значения из 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

Вы должны сказать это «добавить», а не «заменить» ' –

+0

Как вы сказали, легко пропустить :-) –

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> 

Легко пропустить, поэтому не забудьте указать атрибут AppendDataBoundItems, который я добавил.

6

Я действительно не испытал это, но я предполагаю, что вы могли бы добавить элемент после того, как вы переплетены список падение вниз. Вы можете добавить это событие в любой раскрывающийся список, к которому вы хотели бы добавить это пустое поле.

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

Justin - проблема с этим способом добавления строки в том, что она по-прежнему доступна. Если пустая строка добавляется для разделения, она не должна выбираться пользователем. – 2011-02-02 19:29:19

2

Решаю изменения выберите команду добавления пустой опции:

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

Привет !!!

1

В реализации бритвой стиле у меня это выглядит так:

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

А в JavaScript, который выполняется при загрузке у меня есть это:

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

Существует также более гибкое решение с помощью ненавязчивой валидация (не рассчитывать на HTML5):

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

Конечно, есть сервер-сид e проверка, тоже. Я не думаю, что это хорошая идея, чтобы справляться с занятиями. Например, все, что я показываю на странице, это класс. Этот класс имеет несколько перечислимых свойств типа. Было бы кошмаром реплицировать все эти свойства, но сделать их нулевыми в каком-то дополнительном классе, как некоторые из них, предложенные здесь в stackoverflow.

В конце концов, почему я должен изменить свою бизнес-логику ради какой-то определенной разметки? Вместо этого я занимаюсь всем с помощью javascript и некоторых проверок модели.