Có câu trả lời tốt ở đây nhưng tôi cảm thấy sự cần thiết phải bao gồm nhiều thông tin vì có rất nhiều tùy chọn mà làm việc và chúng ta cần phải quyết định nên sử dụng cái gì.
Trước tiên, chúng ta cần hiểu AppendDataBoundItems
. Nếu AppendDataBoundItems = "true"
, ListItems
được thêm vào số DropDownList
mà không xóa các thẻ cũ. Nếu không, số DropDownList
sẽ bị xóa trước DataBind
tiếp theo. MSDN AppendDataBoundItems doc
Về cơ bản có 2 lựa chọn bao phủ bởi hầu hết các câu trả lời:
1. Xác định một lựa chọn trống trong html và thêm ListItems từ cơ sở dữ liệu vào DropDownList chỉ một lần.
Chú ý 3 điều ở đây:
- Trống
ListItem
được định nghĩa trong html
AppendDataBoundItems="true"
DataBind
KHÔNG kêu gọi postbacks hoặc khi đếm DropDownList
mục là> 1
Nguồn:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
Mã đằng sau:
protected void Page_Load(object sender, System.EventArgs e)
{
if (MyList.Items.Count <= 1) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
Lưu ý: Tôi thích logic của việc kiểm tra số lượng vs kiểm tra IsPostBack
. Mặc dù PostBacks thường là nguyên nhân của databinding trùng lặp, nó có thể gây ra nó theo những cách khác. Kiểm tra số mục là cơ bản chỉ kiểm tra xem nó đã được tải chưa.
OR (tùy chọn để sử dụng IsPostBack
thay)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. Rõ ràng và tải lại DropDownList trên mỗi trang làm mới.
Thông báo 3 chênh lệch từ việc lựa chọn đầu tiên:
AppendDataBoundItems="false"
(nếu nó không được định nghĩa sau đó false
là nó giá trị mặc định)
- Trống
ListItem
đang được thêm vào trong mã phía sau. Chúng tôi không thể xác định nó trong html vì với AppendDataBoundItems="false"
, nó sẽ bị xóa.
DataBind
được gọi trên mỗi Page_Load
Nguồn:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
Mã đằng sau:
protected void Page_Load(object sender, System.EventArgs e)
{
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
protected void MyList_DataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select One -", ""));
}
Cảm ơn .. !! Nó đã giúp – msbyuva
Thnx! hoạt động như một nét duyên dáng – matskn
Tôi có phải là người duy nhất đang gặp sự cố với OnDataBound khi tìm phương pháp bạn đã khai báo để sử dụng không? Nó không xuất hiện để được tìm kiếm trong phần cuối của mã (Mặc dù thực tế toàn bộ DropDownList là dân cư và tạo ra ở đó.) –