2011-01-13 38 views
6

Tôi có một ListBox mà tôi đang thêm ListItems vào một codebehind. Vấn đề tôi gặp phải là ListBox không nhìn thấy các mục đã chọn. Tôi có ListBox được dân cư động tùy thuộc vào những gì người dùng lựa chọn từ một DropDownList, do đó, DropDownList có AutoPostBack thiết lập là true. Tôi nghĩ rằng điều này là bằng cách nào đó gây ra vấn đề.ListBox không nhận được các mục đã chọn

Phương thức SelectedIndexChanged của tôi, được sử dụng bất cứ khi nào một mục trong DropDownList được chọn, gọi một phương thức có tên là PopulateListBox. Đây là những gì các phương pháp đó trông giống như:

protected void SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string typeStr = type.SelectedItem.Text; 
    MyType = Api.GetType(typeStr); 
    PopulateListBox(); 
} 

private void PopulateListBox() 
{ 
    listbox.Items.Clear(); 
    foreach (PropertyInfo info in MyType.GetProperties()) 
     listbox.Items.Add(new ListItem(info.Name)); 
} 

Đối với những gì nó có giá trị, đây là DropDownList và ListBox:

<asp:DropDownList runat="server" ID="type" width="281px" OnSelectedIndexChanged="SelectedIndexChanged" AutoPostBack="true" /> 

<asp:ListBox runat="server" ID="listbox" width="281px" height="200px" selectionmode="Multiple" /> 

Những gì tôi đang cố gắng làm là thêm một danh sách các chuỗi (strings là chọn các mục) dưới dạng biến phiên khi nhấp vào nút gửi. Nút chuyển hướng đến một trang mới sau khi Danh sách đã được thêm vào phiên. Đi qua trong trình gỡ lỗi, Danh sách các chuỗi trống ở điểm mà tôi thêm nó vào phiên.

listbox.GetSelectedIndices() không trả lại gì.

Cập nhật

tôi có thể truy cập vào các mục đã chọn nếu tôi không thực hiện thay đổi trong DropDownList. ListBox ban đầu được điền trên tải trang và nếu tôi thực hiện lựa chọn, chúng sẽ được nhận dạng. Nếu tôi chọn một cái gì đó từ DropDownList và ListBox được repopulated, các lựa chọn không được công nhận.

Phương thức Page_Load của tôi chỉ có hai thứ. Nó khởi tạo biến Api của tôi và gọi PopulateDropDown, trông như thế này:

private void PopulateDropDown() 
{ 
    foreach (Type t in Api.GetAllTypes()) 
     type.Items.Add(new ListItem(t.Name)); 
    string typeStr = type.Items[0].Text; 
    Type = Api.GetType(typeStr); 
    PopulateListBox(); 
} 
+0

Nhưng khi nào bạn không thể thấy các mục đã chọn trong hộp danh sách? Khi thay đổi lựa chọn trong danh sách thả xuống? Hoặc bạn có một số kiểm soát khác thực hiện postback? – dzendras

+0

@dzendras: Tôi đã cập nhật bài đăng ở dưới cùng về vấn đề này. –

+0

Khi nào bạn truy cập hộp danh sách? PageLoad? Kiểm tra xem nơi mà bạn truy cập nó là ok theo vòng đời trang ASP.NET (Trên các giai đoạn đầu của điều khiển yêu cầu xử lý không có thuộc tính của họ thiết lập). Ngoài ra, hãy kiểm tra xem bạn có không xóa hộp danh sách trước đó trong vòng đời của trang hay không. – dzendras

Trả lời

13

Vấn đề là bạn gọi PopulateDropDown() trên mỗi đơn Page_Load(), trong đó kêu gọi PopulateListBox(), mà xóa ListBox và phục hồi nó. Bằng cách xóa hộp danh sách, bạn xóa lựa chọn.

Bạn cần thay thế cuộc gọi của mình thành PopulateDropDown() trong số Page_Load() bằng mã sau. Vấn đề mà tôi nghĩ rằng bạn không nhận ra là trang được tải trên mỗi bài đăng - và trong vòng đời trang, tải trang xảy ra trước sự kiện. Vì vậy, bằng cách chọn một mục thả xuống, trước tiên bạn thực thi sự kiện Page_Load() (gián tiếp thực thi phương thức LoadListBox, xóa lựa chọn). Mã sau sẽ điền danh sách thả xuống vào lần đầu tiên trang tải chỉ. Giữ nó giống bất cứ nơi nào khác mà bạn đang sử dụng phương pháp tải thả xuống:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Do your API code here unless you want it to occur only the first 
    // time the page loads, in which case put it in the IF statement below. 
    if (!IsPostBack) 
    { 
     PopulateDropDown(); 
    } 
} 

Các IsPostBack trả về một boolean chỉ ra xem mã phía máy chủ đang chạy vì trang đang tải cho lần đầu tiên ("false") hoặc là một bài đăng trở lại ("true"). Như tôi đã nói ở nơi khác, hãy nhớ rằng một hộp danh sách có tiềm năng cho nhiều giá trị được chọn phải được xử lý khác với một giá trị có tiềm năng cho một lựa chọn duy nhất.Đừng tham khảo listbox.SelectedItem, mà đúng hơn:

foreach (ListItem item in lbFullNames) 
{ 
    if (item.Selected) 
    { 
     // TODO: Whatever you are doing with a selected item. 
    } 
} 
+0

Ah, cảm ơn Justin. DropDownList chỉ gọi một postback vì AutoPostBack được đặt thành true cho nó, đúng không? Tôi sẽ cung cấp cho giải pháp của bạn một shot vào ngày mai và báo cáo lại. –

+0

Có, nhưng nếu bạn đặt AutoPostBack thành false thì mã C# sẽ không thực thi khi bạn thay đổi các chỉ mục, có nghĩa là hộp danh sách sẽ không lặp lại. –

1

Tôi cũng đã phát hiện ra rằng nếu bạn vô hiệu hóa các ListBox server-side, sau đó sử dụng mã phía khách hàng để kích hoạt các hộp danh sách sử dụng mã như sau, thì bạn không thể có được phía máy chủ mục đã chọn.

$('.css-class-assigned-to-listbox').attr('disabled', ''); 

Khắc phục chỉ đơn giản là đảm bảo nó được bật phía máy chủ (mặc định), sau đó tắt (xem ở trên) hoặc bật (xem ở trên) sử dụng mã phía máy khách.

$('.css-class-assigned-to-listbox').attr('disabled', 'disabled'); 
Các vấn đề liên quan