ภายใต้สถานการณ์เฉพาะ ASP.NET fires การเปลี่ยนแปลงเหตุการณ์สำหรับเว็บ ASP.NET ควบคุมแม้ว่าคุณเปลี่ยนตัวควบคุมไม่
บางควบคุม เช่นนั้น
SelectedIndexChangedเหตุการณ์ในตัว
DropDownListตัวควบคุมหรือ
TextChangedเหตุการณ์ในตัว
กล่องข้อความควบคุม อาศัยการลงทะเบียนของเหตุการณ์การเปลี่ยนแปลงไปใช้สถานะของมุมมอง คุณพบปัญหานี้เมื่อคุณสร้างตัวควบคุมเหล่านี้แบบไดนามิกหลังจากที่เหตุการณ์คือ hooked ขึ้น
เมื่อ ASP.NET renders หน้าไปยังเบราว์เซอร์ ตัวควบคุมต่าง ๆ ที่สร้างขึ้นแบบไดนามิกไม่มีเหตุการณ์การเปลี่ยนแปลงที่เกี่ยวข้อง เนื่องจากไม่มีอยู่ ASP.NET ไม่บันทึกสถานะของมุมมอง ซึ่งเรียกว่า Optimization องค์ประกอบของมุมมอง
เมื่อหน้าจะถูกลงรายการบัญชีกลับ และ เมื่อเหตุการณ์ต่าง ๆ จะ hooked อัพ ASP.NET expects สถานะของมุมมอง แต่พบว่า ไม่มีอยู่ ความแตกต่างนี้ fires เหตุการณ์การเปลี่ยนแปลงแม้ว่าตัวควบคุมไม่ได้ถูกเปลี่ยนแปลง
ตรวจสอบให้แน่ใจว่า คุณ hook อัพเหตุการณ์การเปลี่ยนแปลงสำหรับตัวควบคุมที่สร้างขึ้นแบบไดนามิกก่อน ASP.NET renders หน้า ซึ่งช่วยให้มั่นใจว่า การดูสถานะสำหรับตัวควบคุมมีอยู่
ลักษณะการทำงานนี้เกิดจากการออกแบบ
ขั้นตอนในการทำให้สถานการณ์เกิดขึ้นอีกครั้ง
สร้างฟอร์มของเว็บ
- สร้างโปรแกรมประยุกต์ ASP.NET Visual Basic ที่ใหม่ที่ชื่อว่า ChangeFired
- เปิด WebForm1 ในโหมดตัวออกแบบ ลากตัวdataListตัวควบคุม คำปุ่มตัวควบคุม และ aชุดข้อมูลควบคุมลงบนแบบฟอร์ม
- ในการเพิ่มชุดข้อมูลกล่องโต้ตอบ คลิกชุดข้อมูล untypedแล้ว คลิกตกลง. เก็บชื่อเริ่มต้นสำหรับตัวควบคุมทั้งหมด
- แก้ไขชุดตารางสำหรับ DataSet1 เพิ่มตารางใหม่ที่ชื่อว่า Table1
- แก้ไขชุดเก็บรวบรวมคอลัมน์สำหรับ Table1 เพิ่มคอลัมน์ใหม่ที่ชื่อว่า Column1
- คลิกDataList1และเปลี่ยนแปลงแล้ว นี้แหล่งข้อมูลคุณสมบัติการDataSet1.
- คลิกขวาDataList1ชี้ไปที่แก้ไขแม่แบบแล้ว คลิกแม่แบบรายการ. ลากตัวDropDownListควบคุมไปยังItemTemplateส่วน
- คลิกDropDownList1แล้ว เพิ่มห้ารายการไปยังคอลเลกชันของรายการ ตั้งค่านี้ข้อความและค่าคุณสมบัติของรายการเหล่านี้ไปยังหนึ่ง,สอง,3,สี่และห้าตามลำดับ
- ตั้งค่านี้AutoPostBackคุณสมบัติการTrueสำหรับ DropDownList1
- แก้ไขคอลเลกชัน DataBindings สำหรับ DropDownList1 เพิ่มนิพจน์การผูกแบบกำหนดเองต่อไปนี้ไปSelectedIndexคุณสมบัติ:
DataBinder.Eval(Container, "DataItem.Column1")
- สลับไปยังมุมมอง HTML ตั้งค่านี้TraceคุณลักษณะการTrueในการ@ หน้าdirective ดังกล่าว:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb"
Inherits="ChangeFired.WebForm1" trace="true" %>
เพิ่มแฟ้ม Behind รหัส
- คลิกขวา WebForm1.aspx และจากนั้น คลิกรหัสของมุมมอง.
- เพิ่มรหัสต่อไปนี้ไป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 If
Dim objItem As DataListItem
For 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 If
Next
- สร้างใหม่ย่อยขั้นตอนด้านล่างนี้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
'Next
End Sub
เรียกใช้ในตัวอย่าง
- เรียกใช้เพจนี้ การแจ้งเตือนที่สร้างขึ้นแบบไดนามิกDropDownListตัวควบคุมประกอบด้วยสถานะการแสดงในรายละเอียดการสืบค้นกลับสำหรับแผนภูมิการควบคุม
ปัญหานี้เกิดขึ้นเนื่องจากการเรียกไปDataBindวิธีสร้างแบบไดนามิกDropDownListตัวควบคุม และคุณ hook ขึ้นตัวจัดการเหตุการณ์หลังจากDataBindเรียกใช้ในการPage_Loadเหตุการณ์ เนื่องจากมีการควบคุมการเหตุการณ์จัดการ องค์ประกอบของมุมมอง Optimization ไม่เกิดขึ้น - คลิกปุ่มบนหน้า แจ้งให้ทราบว่า การลงรายการบัญชีการกลับไปเกิดขึ้น และรหัสภายในเท่านั้นPage_Loadเหตุการณ์ที่ทำงาน สถานะของมุมมองที่มีอยู่สำหรับการDropDownListควบคุมการเนื่องจากตัวจัดการเหตุการณ์การเชื่อมโยงกับตัวควบคุม
- เปลี่ยนค่าได้DropDownListตัวควบคุม ขอให้สังเกตว่า การลงรายการบัญชีการกลับไปเกิดขึ้น นอกจากนี้ ให้สังเกตว่า ASP.NET firesPage_Loadเหตุการณ์และทำการDropDownList1_SelectedIndexChangedเหตุการณ์
- ในการDropDownList1_SelectedIndexChangedเหตุการณ์ เรียกการDataBindวิธีการสร้างใหม่อีกครั้งDropDownListตัวควบคุม
เนื่องจากการSelectedIndexChangedเหตุการณ์คือไม่ hooked ขึ้นไปใหม่เหล่านี้DropDownListตัวควบคุม ASP.NET ใช้ Optimization องค์ประกอบของมุมมอง และไม่ต้องบันทึกการดูสถานะสำหรับข้อความใหม่DropDownListตัวควบคุม - ตรวจสอบข้อมูลการสืบค้นกลับสำหรับแผนภูมิการควบคุม สังเกตว่า การDropDownListตัวควบคุมไม่ได้ดูสถานะ
- คลิกปุ่มบนหน้า แจ้งให้ทราบว่า การลงรายการบัญชีการกลับไปเกิดขึ้น และคำประกาศ ASP.NET ทำงานนี้Page_Loadเหตุการณ์ เนื่องจากคุณ hook นี้SelectedIndexChangedเหตุการณ์ไปยังDropDownListตัวควบคุม ASP.NET expects สถานะของมุมมองที่จะเชื่อมโยงกับตัวควบคุม
อย่างไรก็ตาม เนื่องจากไม่มีสถานะของมุมมอง ASP.NET firesSelectedIndexChangedเหตุการณ์ แม้คุณไม่ได้เลือกรายการ
การแก้ไข
เมื่อต้องการแก้ไขปัญหานี้ uncomment รหัสในนั้น
DropDownList1_SelectedIndexChangedเหตุการณ์เพื่อให้ตัวจัดการเหตุการณ์ที่ hook ขึ้นกับตัวควบคุมที่สร้างขึ้นใหม่
หมายเลขบทความ (Article ID): 314809 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 3.0
ใช้กับ
- Microsoft ASP.NET 1.1
- Microsoft ASP.NET 1.0
| kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms kbmt KB314809 KbMtth |
แปลโดยคอมพิวเตอร์ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:
314809
(http://support.microsoft.com/kb/314809/en-us/
)