2009-04-08 13 views
35

Tôi có một DropDownList bên trong một số UpdatePanel được điền trên postback từ SqlDataSource. Nó có một tham số là một điều khiển khác. Đôi khi tôi cần nhiều lần đăng lại, nhưng điều xảy ra là mỗi khi bảng cập nhật làm mới, các mục được thêm vào DropDownList. Vì vậy, DropDownList sẽ kết thúc với dữ liệu không chính xác hoặc dữ liệu lặp lại.DropDownList AppendDataBoundItems (mục đầu tiên để trống và không có bản sao)

Tôi có thuộc tính AppendDataBoundItems được đặt thành true vì tôi cần mục đầu tiên để trống.

Làm cách nào để khắc phục sự cố này? Có cách nào khác để có một mục đầu tiên trống không?

(DropDownList Đây là một ứng dụng web asp.net-2.0, và codebehind là trong C#)

Cảm ơn bạn.

Trả lời

61

Thay vì sử dụng AppendDataboundItems='true' (điều này sẽ gây ra sự cố bạn đang nói đến), hãy trả lời sự kiện DataBound cho DropDownList và sau đó thêm mục "trống" của bạn vào đầu danh sách.

<asp:DropDownList runat="server" ID="MyList" 
    ondatabound="MyListDataBound"></asp:DropDownList> 

Sau đó, trong mã của bạn đằng sau:

protected void MyListDataBound(object sender, EventArgs e) 
{ 
    MyList.Items.Insert(0, new ListItem("- Select -", "")); 
} 
+0

Cảm ơn .. !! Nó đã giúp – msbyuva

+0

Thnx! hoạt động như một nét duyên dáng – matskn

+0

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 ở đó.) –

0

Mã này hoạt động, hãy thử để cho nó một giá trị:

MyList.Items.Insert(0, new ListItem("- Select -", "0")); 
4

Bạn có thể ràng buộc DropDownList rằng trong mã phía sau. Vì vậy, bạn không nên làm điều đó sau khi postback một lần nữa:

// probably in Page_Load method 
if (!Page.IsPostBack) 
{ 
    // do data binding here 
}; 
1
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server" 
    DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state"> 
    <asp:ListItem Text="(Select a State)" Value="" /> 
</asp:DropDownList> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>" 
    SelectCommand="SELECT DISTINCT [state] FROM [authors]"> 
</asp:SqlDataSource> 
0

Dưới đây là một ý tưởng.

Có một thuộc tính trong danh sách thả xuống được gọi là AutoPostBack đặt nó thành đúng và sau đó trong mã phía sau bạn đặt tất cả phương thức ràng buộc bên trong if(!Page.IsPostBack). Điều đó làm việc cho tôi.

liên quan.

2

Dưới đây là một ý tưởng, chúng ta có thể sử dụng 2 sự kiện: DataBoundDataBinding:

protected void MyListDataBound(object sender, EventArgs e) 
{ 
    MyList.Items.Insert(0, new ListItem("- Select -", "")); 
} 

protected void MyListDataBinding(object sender, EventArgs e) 
{ 
    MyList.Items.Items.Clear(); 
} 
+0

Xóa danh sách trong hàm MyListDataBinding có hiệu quả giống như thiết lập AppendDataBoundItems = "false". –

3

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 -", "")); 
} 
0

Just Thêm EnableViewState = "false" cho thẻ Dropdown

<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" 
DataTextField="Name" DataValueField="ID" EnableViewState="false" 
AppendDataBoundItems="true"> 
    <asp:ListItem Value="">Select</asp:ListItem> 
</asp:DropDownList>