2009-06-11 36 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 2014-04-16 23:19:03

回答

50

您可以简单地在DropDownList标记中添加ListItem。之后所有来自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

你必须告诉它'附加'而不是'替换' – 2009-06-11 21:22:20

+0

正如你所说,很容易错过:-) – 2009-06-11 21:24:12

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

我解决改变选择命令添加一个空的选项:

 <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: '' } }) }); 

当然,有一个server-sid也检查。 我不认为应对课堂是个好主意。例如,我在页面上显示的所有内容都是一些类。这个类有几个枚举类型的属性。复制所有这些属性将是一场噩梦,但在某些额外的类中使它们为空是有道理的,就像在这里通过stackoverflow建议的那样。

毕竟,为什么我应该为了某些特定的标记而改变业务逻辑?相反,我通过javascript和一些模型检查来处理所有事情。