2008-12-03 8 views
5

Tôi có một điều khiển hộp danh sách:selectedIndex bị mất trong quá trình đăng lại - ASP.NET

 

<asp:ListBox runat="server" id="lbox" autoPostBack="true" /> 
 

Các mã sau giống:

 

private void Page_Load(object sender, System.EventArgs e) 
{ 
    lbox.SelectedIndexChanged+=new EventHandler(lbox_SelectedIndexChanged); 
    if(!Page.IsPostBack) 
    { 
     LoadData();  
    } 
} 
private LoadData() 
{ 
    lbox.DataSource = foo(); 
    lbox.DataBind(); 
} 
protected void lboxScorecard_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int index = (sender as ListBox).selectedIndex; 
} 
 

Vấn đề của tôi là khi trang của tôi nhận được một bài đăng lại (khi người dùng thực hiện lựa chọn trong hộp danh sách), lựa chọn luôn "nhảy" vào mục đầu tiên trong hộp danh sách, để biến chỉ mục trong hàm gọi lại của tôi luôn là 0.

Có vẻ như đây có thể là chế độ xem ăn vấn đề? Làm thế nào tôi có thể sửa chữa nó để chỉ số lựa chọn vẫn còn thông qua postback?

Không có ajax xảy ra, đây là .NET 1.0.

Cảm ơn.

EDIT 1 JohnIdol đã giúp tôi tiến gần hơn, Nếu tôi chuyển nguồn dữ liệu từ DataTable gốc sang ArrayList, thì mọi thứ hoạt động bình thường ... điều gì sẽ gây ra điều này?

Chỉnh sửa 2 Hóa ra DataTable của tôi có nhiều giá trị giống nhau, để chỉ mục được xử lý giống như tất cả các mục có cùng giá trị ... nhờ những người đã giúp!

+0

chính xác cùng thứ trên .NET 2.0 hoạt động tốt cho tôi – JohnIdol

+0

vui mừng khi thấy sự cố của bạn được giải quyết – JohnIdol

Trả lời

2

Đầu ra của lệnh gọi hàm foo() là gì?

Populating hộp danh sách theo cách thủ công, bạn có thể đặt chỉ mục thành bất kỳ thứ gì bạn muốn (ví dụ 0) - vì vậy cùng một điều có thể xảy ra khi đặt một nguồn dữ liệu nhất định trong một số trường hợp nhất định (một chỉ định các chỉ mục tôi giả định). Nếu tất cả các chỉ số mục là 0 thì kết quả là sự kiện SelectedIndexChanged không được nâng lên (chỉ số không thay đổi!) Và mọi thứ sẽ bị rối loạn: khi lựa chọn post-back sẽ quay trở lại mục đầu tiên trong danh sách.

Điều này sẽ giải thích nó - Tôi không thể nghĩ ra bất cứ điều gì khác - nó hoạt động tốt cho tôi trên .NET 2.0 Tôi đang sử dụng một ArrayList với các chuỗi để điền vào listBox.

Cách duy nhất tôi có thể tạo lại vấn đề của bạn là đặt tất cả chỉ mục thành 0.

Tôi muốn nói thêm đồng hồ vào ListBox và kiểm tra các chỉ mục trong thời gian chạy để đảm bảo chúng không phải là tất cả các số không.

+0

Tôi đang ràng buộc dữ liệu với một bảng dữ liệu ... điều này thực sự bắt đầu thổi tâm trí của tôi ... Tôi chắc chắn nghĩ rằng đây là một điều dễ dàng để sửa chữa ... – mmattax

+0

thử với một danh sách và xem những gì xảy ra chỉ tò mò. Hãy chắc chắn rằng DataTable chỉ có một cột – JohnIdol

+0

Tôi vừa thử một danh sách mảng, nó hoạt động ... bây giờ tôi chỉ cần tìm ra sai với dữ liệu của tôi ... mặc dù nó đến ngay từ truy vấn db ... bất kỳ ý tưởng nào? – mmattax

-2

Tôi không biết nếu nó làm cho một sự khác biệt hay không, nhưng tôi thường đính kèm điều khiển của tôi đến những sự kiện trên trang đầu chứ không phải là trong codebehind. Trong ví dụ của bạn, tôi đã làm:

<asp:ListBox runat="server" id="lbox" autoPostBack="true" OnSelectedIndexChanged="lboxScorecard_SelectedIndexChanged" /> 

Ngoài ra, tôi sẽ xác minh rằng ViewState được bật. ViewState có thể được bật tại trang kiểm soát, trang, & thậm chí cấp trang web.

0

Có vẻ với tôi như bạn đang tạo một eventhandler mới trên mỗi tải trang. Điều này có thể gây ra sự cố. Tại sao không đính kèm trình quản lý sự kiện theo cách khai báo:

<asp:ListBox runat="server" id="lbox" autoPostBack="true" OnSelectedIndexChanged="lbox_SelectedIndexChanged" /> 

cũng vậy, tại sao không trực tiếp tham chiếu điều khiển thay vì truyền?

protected void lbox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int index = lbox.selectedIndex; 
} 
+0

Tôi đang truyền vì với .net 1.0, bạn sẽ phải có điều khiển dưới dạng biến mẫu trong mã phía sau, trong. NET 2.0 + điều khiển có thể truy cập mà không có biến mẫu. – mmattax

+0

Thêm trình xử lý sự kiện không giải quyết được sự cố của tôi ... – mmattax

+0

Thật vậy, tôi đã lấy mã để tạo trình xử lý sự kiện mỗi lần và mọi thứ hiện đang hoạt động. Bây giờ, những gì tôi thực sự tự hỏi là ai là những người mà xuống bỏ phiếu tất cả các thời gian? Tôi rất đau vì điều đó - đây không phải là lần đầu tiên tôi sử dụng một giải pháp bình chọn xuống chỉ để tìm ra nó là câu trả lời hay nhất. –

-1

Bạn đã nghĩ về việc tải dữ liệu trước đó - ví dụ: trong sự kiện OnInit trên trang/điều khiển người dùng. Điều này xảy ra trước khi dữ liệu postback được tải và do đó trước khi một thay đổi có thể được xử lý? Tôi tin rằng điều đó sẽ hiệu quả - nhưng bạn có thể muốn tắt chế độ xem!

0

Làm việc cho tôi. Foo của bạn() có trả lại cùng các giá trị mỗi lần không?

Cũng giống như một lưu ý phụ: nếu có thể, bạn nên thực sự làm dữ liệu của bạn trong OnInit (mỗi lần, không chỉ trên GET). Nếu bạn làm điều đó trước khi cuộc gọi đến base.OnInit (...), nội dung của hộp danh sách của bạn sẽ không phải được serialized và deserialized đến và từ ViewState và gửi qua dây cho khách hàng (có, bạn sẽ được đánh cơ sở dữ liệu nhiều hơn, nhưng bạn sẽ nhấn một hệ thống nằm trên mạng con cục bộ của bạn, hoặc thậm chí trên cùng một máy. Hơn nữa, cơ sở dữ liệu có khả năng sẽ lưu lại kết quả).

Nếu bạn muốn xây dựng các trang web hiệu suất cao, bạn cần xem xét kỹ cách bạn sử dụng ViewState. Tôi khuyên bạn nên viết bài viết này: TRULY Understanding ViewState

+0

Mã doe của tôi không thực sự thực hiện databinding như ví dụ của tôi cho thấy, tôi thực sự đang databinding trên một nút bấm ... – mmattax

+0

Bạn đã giải quyết được vấn đề chưa? Nếu vậy, giải pháp là gì? – Rune

+0

Ồ, đừng bận tâm, tôi thấy bạn đã đăng giải pháp :-) – Rune

1

Databinding DropDownLists/ListBoxes rất đau đớn, vì chúng thường liên kết với các giá trị sai.

Tôi đã từ bỏ việc sử dụng DataBind(), và chỉ cần nghỉ mát để sử dụng một vòng lặp foreach:

foreach (Item i in DataSet) 
{ 
    listBox.Items.Add(etc); 
} 
10

Vấn đề thực đây là thứ tự của các sự kiện. Khi bạn databind trong page_load bạn ghi đè lên dữ liệu được đăng, đó là lý do tại sao lựa chọn không được đặt trong hộp danh sách. Bạn có thể dễ dàng khắc phục điều này bằng cách di chuyển logic ràng buộc tới Page_Init.

+0

lời khuyên tuyệt vời! Tôi đã luôn luôn nghĩ rằng đây là một số wierdness để làm với việc bị vô hiệu hóa ViewState, nhưng ngay cả với Viewstate vô hiệu hóa danh sách thả xuống của tôi hoạt động tốt khi tôi di chuyển mã ràng buộc của tôi để Init –

1

Tải dữ liệu trong Page_Init thay vì Page_Load. Dữ liệu phải được điền trong Page_init để có sẵn trong PostBack.

2

nếu mục danh sách của bạn giống nhau thì chỉ mục đã chọn sẽ được đặt thành 0.Để khắc phục, hãy đặt các giá trị khác nhau thành item.value và để item.text vẫn giữ nguyên .. sau đó chỉ mục đã chọn sẽ được hiển thị chính xác.