ในบทความที่แล้ว เราทราบวิธีเชื่อมโยง ControlParameter (พารามิเตอร์ควบคุม) กับคุณสมบัติ SelectedValue ของ GridView เพื่อใช้ตารางข้อมูลหลัก-รอง คุณสมบัติ SelectedValue ส่งกลับค่าของฟิลด์แรกที่ระบุโดยคุณสมบัติ DataKeyNames คุณยังสามารถระบุค่าฟิลด์ที่คั่นด้วยเครื่องหมายจุลภาคหลายค่าสำหรับคุณสมบัติ DataKeyNames ได้ ตัวอย่างเช่น คุณอาจต้องส่งค่าหลายค่าจากตารางไปยังแหล่งข้อมูล ค่าฟิลด์คีย์เพิ่มเติมเหล่านี้จะถูกเปิดเผยผ่านคุณสมบัติ SelectedDataKey ซึ่งส่งคืนอ็อบเจ็กต์ DataKey ที่มีคู่ชื่อ/ค่าของฟิลด์คีย์ ControlParameter ยังสามารถอ้างอิงคีย์เหล่านี้ได้ด้วยการตั้งค่าคุณสมบัติ PropertyName ในนิพจน์ (เช่น SelectedDataKey.Values("title_id"))
<asp:ControlParameter Name = "FirstKey" ControlID = "MasterGrid" PropertyName = "SelectedDataKey.Values [0]"/>
<asp:ControlParameter Name="SecondKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[1]"/>
ตัวอย่างต่อไปนี้สาธิตโค้ดที่แจงนับคอลเลกชัน DataKeys และได้รับค่าของฟิลด์คีย์จาก SelectedDataKey ของการ GridView:
ป้องกัน Sub GridView1_SelectedIndexChanged (ผู้ส่ง ByVal As Object, ByVal e As System.EventArgs)
Response.Write("<b>SelectedDataKey.Value: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Value) & "<br />")
Response.Write("<b>DataKey ฟิลด์ 1: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("au_id")) & "<br />")
Response.Write("<b>DataKey ฟิลด์ 2: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("title_id")) & "<br />")
จบหมวดย่อย
ป้องกัน Sub GridView1_DataBound (ผู้ส่ง ByVal As Object, ByVal e As System.EventArgs)
หรี่คีย์เป็น DataKey
Response.Write("<b>GridView DataKeys: </b><br />")
สำหรับแต่ละคีย์ใน GridView1.DataKeys
Response.Write (Server.HtmlEncode (key.Values (0)) & `, ")
Response.Write(Server.HtmlEncode(key.Values(1)) & "<br/>")
ต่อไป
End Sub
จะแสดงข้อมูลจากตารางทาสในการควบคุมอิสระของแบบฟอร์ม แต่บางครั้งเราต้องการให้การควบคุมตารางทาสซ้อนอยู่ในการควบคุมตารางหลักและแสดงเป็นส่วนหนึ่งของตารางหลัก . เพื่อให้บรรลุฟังก์ชันนี้ คุณต้องรวมตัวควบคุมตารางทาสและแหล่งข้อมูลที่เกี่ยวข้องลงในเทมเพลตของตัวควบคุมตารางหลัก และมีพารามิเตอร์แหล่งข้อมูลเพื่อรับค่าจากฟิลด์ของแหล่งข้อมูลตารางหลัก เนื่องจากไม่มีออบเจ็กต์พารามิเตอร์ที่ประกาศที่จะเชื่อมโยงกับแนวทางนี้ คุณต้องตั้งค่าพารามิเตอร์โดยทางโปรแกรมในโค้ด เมื่อรายการข้อมูลของตัวควบคุมตารางหลักถูกผูกไว้ คุณสามารถตั้งค่าพารามิเตอร์ในตัวจัดการเหตุการณ์ของตัวควบคุมตารางหลักได้ (เช่นเหตุการณ์ DataBound ของ FormView) ตัวอย่างต่อไปนี้แสดงให้เห็นถึงเทคนิคนี้
<สคริปต์ runat="เซิร์ฟเวอร์">
FormView1_DataBound ย่อยที่ได้รับการป้องกัน (ผู้ส่ง ByVal As Object, ByVal e As System.EventArgs)
OrderDetailsDataSource.SelectParameters("OrderID").DefaultValue = FormView1.DataItem("OrderID")
จบหมวดย่อย
</script>
<asp:FormView DataSourceID="OrdersDataSource"……>
<เทมเพลตรายการ>
<b>รหัสคำสั่งซื้อ:</b>
<asp:Label ID="OrderIDLabel" runat="server" Text='<%# Eval("OrderID") %><'></asp:Label><br />
-
<asp:GridView DataSourceID = "OrderDetailsDataSource" ……>
-
</asp:GridView><
</เทมเพลตรายการ">
</asp:FormView>
< <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %><" ID="OrdersDataSource" runat="server" SelectCommand="SELECT [OrderID], [OrderDate], [ShipCity], [ShipCountry " ] จาก [คำสั่งซื้อ]">
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %">" ID="OrderDetailsDataSource" runat="server" SelectCommand="SELECT [รายละเอียดคำสั่งซื้อ].OrderID, Products.ProductName, [รายละเอียดคำสั่งซื้อ].UnitPrice, [คำสั่งซื้อ รายละเอียด].ปริมาณจาก [รายละเอียดการสั่งซื้อ] INNER JOIN สินค้าบน [รายละเอียดการสั่งซื้อ].ProductID = Products.ProductID WHERE [รายละเอียดการสั่งซื้อ].OrderID = @OrderID">
<เลือกพารามิเตอร์>
<asp:ชื่อพารามิเตอร์="OrderID" />
</เลือกพารามิเตอร์><
<asp:SqlDataSource>
ตัวอย่างต่อไปนี้สาธิตเทคนิคที่คล้ายกัน ซึ่งใช้ DataList และจัดการเหตุการณ์ ItemDataBound ของ DataList เพื่อตั้งค่าพารามิเตอร์แหล่งข้อมูล
<สคริปต์ runat="เซิร์ฟเวอร์">
DataList1_ItemDataBound ย่อยที่ได้รับการป้องกัน (ผู้ส่ง ByVal เป็นวัตถุ, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs)
Dim s As SqlDataSource = e.Item.FindControl("OrderDetailsDataSource")
s.SelectParameters("OrderID").DefaultValue = e.Item.DataItem("OrderID")
จบหมวดย่อย
</สคริปต์><