PRB: ASP.NET fires เหตุการณ์การเปลี่ยนแปลงแม้ว่าคุณไม่เปลี่ยนแปลงค่าการควบคุม

ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ

ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:314809
อาการ
ภายใต้สถานการณ์เฉพาะ ASP.NET fires การเปลี่ยนแปลงเหตุการณ์สำหรับเว็บ ASP.NET ควบคุมแม้ว่าคุณเปลี่ยนตัวควบคุมไม่
สาเหตุ
บางควบคุม เช่นนั้นSelectedIndexChangedเหตุการณ์ในตัวDropDownListตัวควบคุมหรือTextChangedเหตุการณ์ในตัวกล่องข้อความควบคุม อาศัยการลงทะเบียนของเหตุการณ์การเปลี่ยนแปลงไปใช้สถานะของมุมมอง คุณพบปัญหานี้เมื่อคุณสร้างตัวควบคุมเหล่านี้แบบไดนามิกหลังจากที่เหตุการณ์คือ hooked ขึ้น

เมื่อ ASP.NET renders หน้าไปยังเบราว์เซอร์ ตัวควบคุมต่าง ๆ ที่สร้างขึ้นแบบไดนามิกไม่มีเหตุการณ์การเปลี่ยนแปลงที่เกี่ยวข้อง เนื่องจากไม่มีอยู่ ASP.NET ไม่บันทึกสถานะของมุมมอง ซึ่งเรียกว่า Optimization องค์ประกอบของมุมมอง

เมื่อหน้าจะถูกลงรายการบัญชีกลับ และ เมื่อเหตุการณ์ต่าง ๆ จะ hooked อัพ ASP.NET expects สถานะของมุมมอง แต่พบว่า ไม่มีอยู่ ความแตกต่างนี้ fires เหตุการณ์การเปลี่ยนแปลงแม้ว่าตัวควบคุมไม่ได้ถูกเปลี่ยนแปลง
การแก้ไข
ตรวจสอบให้แน่ใจว่า คุณ hook อัพเหตุการณ์การเปลี่ยนแปลงสำหรับตัวควบคุมที่สร้างขึ้นแบบไดนามิกก่อน ASP.NET renders หน้า ซึ่งช่วยให้มั่นใจว่า การดูสถานะสำหรับตัวควบคุมมีอยู่
สถานะ
ลักษณะการทำงานนี้เกิดจากการออกแบบ
ข้อมูลเพิ่มเติม

ขั้นตอนในการทำให้สถานการณ์เกิดขึ้นอีกครั้ง

สร้างฟอร์มของเว็บ

  1. สร้างโปรแกรมประยุกต์ ASP.NET Visual Basic ที่ใหม่ที่ชื่อว่า ChangeFired
  2. เปิด WebForm1 ในโหมดตัวออกแบบ ลากตัวdataListตัวควบคุม คำปุ่มตัวควบคุม และ aชุดข้อมูลควบคุมลงบนแบบฟอร์ม
  3. ในการเพิ่มชุดข้อมูลกล่องโต้ตอบ คลิกชุดข้อมูล untypedแล้ว คลิกตกลง. เก็บชื่อเริ่มต้นสำหรับตัวควบคุมทั้งหมด
  4. แก้ไขชุดตารางสำหรับ DataSet1 เพิ่มตารางใหม่ที่ชื่อว่า Table1
  5. แก้ไขชุดเก็บรวบรวมคอลัมน์สำหรับ Table1 เพิ่มคอลัมน์ใหม่ที่ชื่อว่า Column1
  6. คลิกDataList1และเปลี่ยนแปลงแล้ว นี้แหล่งข้อมูลคุณสมบัติการDataSet1.
  7. คลิกขวาDataList1ชี้ไปที่แก้ไขแม่แบบแล้ว คลิกแม่แบบรายการ. ลากตัวDropDownListควบคุมไปยังItemTemplateส่วน
  8. คลิกDropDownList1แล้ว เพิ่มห้ารายการไปยังคอลเลกชันของรายการ ตั้งค่านี้ข้อความและค่าคุณสมบัติของรายการเหล่านี้ไปยังหนึ่ง,สอง,3,สี่และห้าตามลำดับ
  9. ตั้งค่านี้AutoPostBackคุณสมบัติการTrueสำหรับ DropDownList1
  10. แก้ไขคอลเลกชัน DataBindings สำหรับ DropDownList1 เพิ่มนิพจน์การผูกแบบกำหนดเองต่อไปนี้ไปSelectedIndexคุณสมบัติ:
    DataBinder.Eval(Container, "DataItem.Column1")					
  11. สลับไปยังมุมมอง HTML ตั้งค่านี้TraceคุณลักษณะการTrueในการ@ หน้าdirective ดังกล่าว:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="ChangeFired.WebForm1" trace="true" %>					

เพิ่มแฟ้ม Behind รหัส

  1. คลิกขวา WebForm1.aspx และจากนั้น คลิกรหัสของมุมมอง.
  2. เพิ่มรหัสต่อไปนี้ไปPage_Loadเหตุการณ์:
    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. สร้างใหม่ย่อยขั้นตอนด้านล่างนี้Page_Loadเหตุการณ์การจัดการการSelectedIndexChangedเหตุการณ์ดังกล่าว:
    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					

เรียกใช้ในตัวอย่าง

  1. เรียกใช้เพจนี้ การแจ้งเตือนที่สร้างขึ้นแบบไดนามิกDropDownListตัวควบคุมประกอบด้วยสถานะการแสดงในรายละเอียดการสืบค้นกลับสำหรับแผนภูมิการควบคุม

    ปัญหานี้เกิดขึ้นเนื่องจากการเรียกไปDataBindวิธีสร้างแบบไดนามิกDropDownListตัวควบคุม และคุณ hook ขึ้นตัวจัดการเหตุการณ์หลังจากDataBindเรียกใช้ในการPage_Loadเหตุการณ์ เนื่องจากมีการควบคุมการเหตุการณ์จัดการ องค์ประกอบของมุมมอง Optimization ไม่เกิดขึ้น
  2. คลิกปุ่มบนหน้า แจ้งให้ทราบว่า การลงรายการบัญชีการกลับไปเกิดขึ้น และรหัสภายในเท่านั้นPage_Loadเหตุการณ์ที่ทำงาน สถานะของมุมมองที่มีอยู่สำหรับการDropDownListควบคุมการเนื่องจากตัวจัดการเหตุการณ์การเชื่อมโยงกับตัวควบคุม
  3. เปลี่ยนค่าได้DropDownListตัวควบคุม ขอให้สังเกตว่า การลงรายการบัญชีการกลับไปเกิดขึ้น นอกจากนี้ ให้สังเกตว่า ASP.NET firesPage_Loadเหตุการณ์และทำการDropDownList1_SelectedIndexChangedเหตุการณ์
  4. ในการDropDownList1_SelectedIndexChangedเหตุการณ์ เรียกการDataBindวิธีการสร้างใหม่อีกครั้งDropDownListตัวควบคุม

    เนื่องจากการSelectedIndexChangedเหตุการณ์คือไม่ hooked ขึ้นไปใหม่เหล่านี้DropDownListตัวควบคุม ASP.NET ใช้ Optimization องค์ประกอบของมุมมอง และไม่ต้องบันทึกการดูสถานะสำหรับข้อความใหม่DropDownListตัวควบคุม
  5. ตรวจสอบข้อมูลการสืบค้นกลับสำหรับแผนภูมิการควบคุม สังเกตว่า การDropDownListตัวควบคุมไม่ได้ดูสถานะ
  6. คลิกปุ่มบนหน้า แจ้งให้ทราบว่า การลงรายการบัญชีการกลับไปเกิดขึ้น และคำประกาศ ASP.NET ทำงานนี้Page_Loadเหตุการณ์ เนื่องจากคุณ hook นี้SelectedIndexChangedเหตุการณ์ไปยังDropDownListตัวควบคุม ASP.NET expects สถานะของมุมมองที่จะเชื่อมโยงกับตัวควบคุม

    อย่างไรก็ตาม เนื่องจากไม่มีสถานะของมุมมอง ASP.NET firesSelectedIndexChangedเหตุการณ์ แม้คุณไม่ได้เลือกรายการ

การแก้ไข

เมื่อต้องการแก้ไขปัญหานี้ uncomment รหัสในนั้นDropDownList1_SelectedIndexChangedเหตุการณ์เพื่อให้ตัวจัดการเหตุการณ์ที่ hook ขึ้นกับตัวควบคุมที่สร้างขึ้นใหม่
ดูสถานะ

คำเตือน: บทความนี้ได้รับการแปลโดยอัตโนมัติ

คุณสมบัติ

รหัสบทความ: 314809 - การตรวจสอบครั้งสุดท้าย: 01/13/2011 07:43:00 - ฉบับแก้ไข: 3.0

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms kbmt KB314809 KbMtth
คำติชม