Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

PRB: ASP.NET cháy sự kiện thay đổi ngay cả khi bạn không thay đổi giá trị kiểm soát

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:314809
TRIỆU CHỨNG
Trong trường hợp cụ thể, ASP.NET cháy sự thay đổi sự kiện cho một ASP.NET Web kiểm soát ngay cả khi bạn không thay đổi sự kiểm soát.
NGUYÊN NHÂN
Một số điều khiển, chẳng hạn như các SelectedIndexChanged sự kiện trong một Dropdowns kiểm soát hoặc các TextChanged sự kiện trong một TextBox kiểm soát, dựa trên đăng ký của sự kiện thay đổi để sử dụng xem nhà nước. Bạn gặp phải vấn đề này khi bạn tạo các điều khiển tự động sau khi sự kiện này được nối.

Khi ASP.NET hiển thị hình ảnh trang để các trình duyệt, các điều khiển được tạo ra tự động không có một liên kết Sự kiện thay đổi. Bởi vì không có sự kiện được trình bày, ASP.NET không lưu dạng xem nhà nước. Điều này được gọi là tối ưu hóa nhà nước xem.

Khi trang là đăng trở lại, và khi các sự kiện đang hooked lên, ASP.NET sẽ xem bang nhưng thấy rằng không có tồn tại. Sự khác biệt này cháy sự kiện thay đổi ngay cả khi các điều khiển không bị thay đổi.
GIẢI PHÁP
Hãy chắc chắn rằng bạn treo lên sự kiện thay đổi cho tự động tạo điều khiển trước khi ASP.NET ám trang. Điều này đảm bảo rằng xem nhà nước Đối với sự kiểm soát tồn tại.
TÌNH TRẠNG
Điều này hành vi là do thiết kế.
THÔNG TIN THÊM

Các bước để tạo lại hành vi

Tạo ra hình thức Web

  1. Tạo ra một mới Visual Basic ASP.NET ứng dụng đặt tên ChangeFired.
  2. Mở WebForm1 trong chế độ thiết kế. Kéo một DataList kiểm soát, một Nút kiểm soát, và một Số liệu kiểm soát vào mẫu.
  3. Trong các Thêm số liệu hộp thoại hộp, bấm vào Số liệu untyped, sau đó bấm Ok. Giữ tên mặc định cho tất cả các điều khiển.
  4. Chỉnh sửa bộ sưu tập bàn cho DataSet1. Thêm một bảng mới đặt tên Table1.
  5. Chỉnh sửa bộ sưu tập cột cho Table1. Thêm một cột mới đặt tên Column1.
  6. Nhấp vào DataList1, và sau đó thay đổi các DataSource bất động sản để DataSet1.
  7. Nhấp chuột phải DataList1, điểm đến Chỉnh sửa mẫu, sau đó bấm Mục mẫu. Kéo một Dropdowns kiểm soát để các ItemTemplate keá tieáp.
  8. Nhấp vào DropDownList1, và sau đó thêm năm bài mục bộ sưu tập. Đặt các Văn bản và các Giá trị thuộc tính khoản mục này để một trong những,hai, ba,bốn, và nămtương ứng.
  9. Đặt các AutoPostBack bất động sản để sự thật cho DropDownList1.
  10. Chỉnh sửa bộ sưu tập cửa cho DropDownList1. Thêm các theo biểu hiện tùy chỉnh ràng buộc để các SelectedIndex bất động sản:
    DataBinder.Eval(Container, "DataItem.Column1")					
  11. Chuyển sang HTML xem. Đặt các dấu vết thuộc tính cho sự thật trong các @ Trang chỉ thị như sau:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="ChangeFired.WebForm1" trace="true" %>					

Thêm tập tin mã phía sau

  1. Nhấp chuột phải vào WebForm1.aspx và bấm Xem mã.
  2. Thêm mã sau đây để các Page_Load sự kiện:
    DataSet1.Tables(0).Rows.Add(New Object() {"1"})DataSet1.Tables(0).Rows.Add(New Object() {"2"})DataSet1.Tables(0).Rows.Add(New Object() {"3"})DataSet1.Tables(0).Rows.Add(New Object() {"4"})If Not IsPostBack Then  DataBind()End IfDim objItem As DataListItemFor Each objItem In DataList1.Items  AddHandler CType(objItem.FindControl("DropDownList1"), _  DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged  If Not objItem.FindControl("DropDownList1") Is Nothing Then    Trace.Write("Added SelectedIndexChanged Handler")  End IfNext					
  3. Tạo ra một mới Phụ thủ tục dưới đây các Page_Load sự kiện để xử lý các SelectedIndexChanged sự kiện như sau:
    Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, _ByVal e As System.EventArgs)  DataBind()  Trace.Write("SelectedIndexChanged, DataBind()")  'Uncomment the following code to resolve this problem.  'Dim objItem As DataListItem  'For Each objItem In DataList1.Items  '  AddHandler CType(objItem.FindControl("DropDownList1"), _  '  DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged  'NextEnd Sub					

Chạy các mẫu

  1. Chạy trang. Nhận thấy rằng tạo ra năng động Dropdowns điều khiển chứa xem tiểu bang trong dấu vết thông tin cho các Điều khiển cây.

    Điều này xảy ra bởi vì các cuộc gọi đến các DataBind phương pháp năng động tạo ra các Dropdowns điều khiển, và bạn treo lên bộ xử lý sự kiện sau khi các DataBind gọi trong những Page_Load sự kiện. Bởi vì các điều khiển có một bộ xử lý sự kiện, View State Tối ưu hóa không diễn ra.
  2. Nhấp vào nút trên trang. Nhận thấy rằng một bài trở lại xảy ra, và chỉ mã bên trong các Page_Load sự kiện chạy. Xem nhà nước tồn tại cho các Dropdowns điều khiển bởi vì một xử lý sự kiện liên kết với các kiểm soát.
  3. Thay đổi các giá trị trong một trong các Dropdowns điều khiển. Chú ý rằng một bài trở lại xảy ra. Ngoài ra, thông báo đó ASP.NET cháy các Page_Load sự kiện và chạy các DropDownList1_SelectedIndexChanged sự kiện.
  4. Trong các DropDownList1_SelectedIndexChanged tổ chức sự kiện, cuộc gọi các DataBind phương thức một lần nữa để tạo mới Dropdowns điều khiển.

    Bởi vì các SelectedIndexChanged sự kiện không nối với các mới Dropdowns điều khiển, ASP.NET sử dụng xem nhà nước tối ưu hóa và không lưu nhà nước xem cho các mới Dropdowns điều khiển.
  5. Xem lại thông tin dấu vết cho cây kiểm soát. Thông báo mà các Dropdowns điều khiển không có xem trạng thái.
  6. Nhấp vào nút trên trang. Nhận thấy rằng các bài trở lại xảy ra, và nhận thấy rằng ASP.NET chạy các Page_Load sự kiện. Bởi vì bạn treo các SelectedIndexChanged sự kiện để các Dropdowns điều khiển, ASP.NET sẽ xem nhà nước để được liên kết với các điều khiển.

    Tuy nhiên, bởi vì nhà nước xem không tồn tại, ASP.NET cháy các SelectedIndexChanged sự kiện, mặc dù bạn không chọn một khoản mục.

Giải pháp

Để giải quyết vấn đề này, bỏ ghi chú mã trong các DropDownList1_SelectedIndexChanged sự kiện để cho xử lý sự kiện treo lên với mới được thành lập điều khiển.
Xem trạng thái

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 314809 - Xem lại Lần cuối: 08/27/2011 17:44:00 - Bản sửa đổi: 2.0

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms kbmt KB314809 KbMtvi
Phản hồi