web-dev-qa-db-ja.com

asp.netドロップダウンリスト-db値の前に空白行を追加

私のページにはDropDownListがあり、SqlDataSourceからデータベース値を取り込みます(以下のコードを参照)。

値の前に独自のテキストまたは空白行を追加するにはどうすればよいですか?

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

ありがとう。

追伸SqlDataSourceを使用することをお勧めしますか、それとも別の方法で入力する方が良いですか?

31
thegunner

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

見逃しやすいので、追加したAppendDataBoundItems属性を忘れないでください。

21
Joel Coehoorn

これは実際にはテストしていませんが、ドロップダウンリストをバインドした後にアイテムを追加できると想定しています。この空のボックスを追加するドロップダウンリストにこのイベントを追加できます。

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

空のオプションを追加するselectコマンドの変更を解決します。

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

こんにちは!!!

2
Aldo

私のかみそりスタイルの実装では、次のようになります。

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

もちろん、サーバー側のチェックもあります。クラスに対処するのは良い考えだとは思いません。たとえば、ページに表示するものはすべてクラスです。このクラスには、列挙可能な型プロパティがいくつかあります。これらすべてのプロパティを複製するのは悪夢ですが、スタックオーバーフローでいくつかのプロパティが示唆しているように、いくつかの追加クラスでそれらをnull可能にします。

結局のところ、特定のマークアップのためにビジネスロジックを変更する必要があるのはなぜですか?代わりに、javascriptといくつかのモデルチェックを介してすべてを処理します。

1
Alexander