2009-06-11 25 views
29

Trên trang của tôi, tôi có một số DropDownList mà tôi điền với giá trị cơ sở dữ liệu từ một số SqlDataSource (xem mã bên dưới).danh sách thả xuống asp.net - thêm dòng trống trước giá trị db

Làm cách nào để thêm văn bản của chính tôi hoặc dòng trống trước giá trị?

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

Cảm ơn.

P.S. Bạn có khuyên bạn nên sử dụng một số SqlDataSource hoặc tốt hơn để điền một cách khác không?

+0

Điều này liên quan đến: http://stackoverflow.com/questions/267064/asp-net-add-blank-item-at-top-of-dropdownlist – mcfea

Trả lời

50

Bạn chỉ cần thêm ListItem bên trong Đánh dấu DropDownList. Tất cả các giá trị từ DataSource sẽ được nối thêm sau đó.

<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

Bạn phải nói điều đó để 'nối thêm' thay vì 'thay thế ' –

+0

Như bạn đã nói, thật dễ dàng để bỏ lỡ :-) –

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> 

Thật dễ bỏ lỡ, vì vậy đừng quên thuộc tính AppendDataBoundItems tôi đã thêm.

6

Tôi chưa thực sự thử nghiệm điều này nhưng tôi giả định rằng bạn có thể thêm mục sau khi bạn đã ràng buộc danh sách thả xuống. Bạn có thể thêm sự kiện này vào bất kỳ danh sách thả xuống nào bạn muốn thêm hộp trống này vào.

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

Justin - vấn đề với cách thêm dòng này là nó vẫn có thể chọn được. Nếu một dòng trống được thêm vào để tách, người dùng không nên chọn nó. –

2

tôi giải quyết thay đổi lệnh select thêm một lựa chọn sản phẩm nào:

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

Chúc mừng !!!

1

Thực hiện dao cạo kiểu với tôi nó trông như thế này:

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

Và trong javascript đó được thực thi trên tải Tôi có điều này:

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

Ngoài ra còn có giải pháp linh hoạt hơn thông qua phô trương xác thực (không được tính vào HTML5):

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

Tất nhiên, có một máy chủ-sid e kiểm tra, quá. Tôi không nghĩ rằng đó là một ý tưởng tốt để đối phó với các lớp học. Ví dụ: mọi thứ tôi hiển thị trong trang là một số lớp. Lớp này có nhiều thuộc tính kiểu đếm được. Nó sẽ là một cơn ác mộng để nhân rộng tất cả các thuộc tính đó, nhưng làm cho chúng vô hiệu hóa trong một số lớp bổ sung như một số đề xuất ở đây trên stackoverflow.

Sau cùng, tại sao tôi nên thay đổi logic nghiệp vụ của mình vì lợi ích của một số đánh dấu cụ thể? Thay vào đó, tôi xử lý mọi thứ thông qua javascript và một số kiểm tra mô hình.

Các vấn đề liên quan