บทความ

Creating Custom Columns for the ASP.NET Datagrid

เรตติ้ง
เขียนโดย admin เมื่อวันที่ 23 January 2008 ตอน 04:51
สร้างคอลัมน์พิเศษสำหรับ Datagrid ของ ASP.NETใช้ได้กับ Microsoft ASP.NET

สรุป:

คอนโทรล  Datagrid ของ ASP.NET จัดเป็นคอนโทรลที่มีประสิทธิภาพมากที่สุดชนิดหนึ่งสำหรับนักพัฒนาเว็บ บทความนี้จะบอกวิธีการว่าคุณจะใช้คอนโทรลนี้ให้มีประสิทธิภาพสูงขึ้นไปอีก     โดยการเพิ่มคอลัมน์พิเศษเพื่อแสดงข้อมูลอย่างเหมาะสมสำหรับผู้ใช้ได้อย่างไร

 

คำนำ

เราคงต้องยอมรับว่าการเขียนโค้ด  Datagrid สำหรับ Microsoft ASP.NET จัดเป็นงานที่ซ้ำซากจำเจพอสมควร แม้แต่คนที่หมกมุ่นกับคอนโทรลตัวนี้อย่างดิฉันก็มักจะหาทางลัดเพื่อทำให้งานต่างๆเหล่านี้ง่ายขึ้น   ทุกคนคงไม่มีใครชอบเขียนโค้ดที่ซ้ำซากจำเจอยู่แล้วใช่หรือไม่?     ดังนั้นเพื่อเป็นการหลีกเลี่ยงการทำงานที่น่าเบื่อเหล่านี้    เป้าหมายของบทความนี้ก็คือการสร้างโค้ดที่สามารถนำไปใช้ซ้ำกับโครงการอื่นๆได้     และนำโค้ดไปใส่เอาไว้ในแพกเก็จง่ายดายที่คุณสามารถนำไปใช้ได้ซ้ำแล้วซ้ำอีก  นั่นคือหัวใจสำคัญของการเขียนโปรแกรมเชิงออปเจ็กต์ และการทำงานร่วมกับ  Datagrid  ก็ไม่มีข้อยกเวน  วิธีการอย่างหนึ่งที่จะทำตามเป้าหมายนี้กับคอนโทรล Datagrid ก็คือเขียนโค้ดที่คุณต้องใช้เป็นประจำกับประเภทคอลัมน์ภายในคอนโทรล   (ที่ดิฉันจะใช้ในตัวอย่างแรกแล้วสร้างประเภทคอลัมน์พิเศษที่คุณสามารถนำไปใช้ซ้ำในโครงการ Datagrid อื่นๆได้

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

 

ในกรณีของการนำโค้ดกลับมาใช้ใหม่

ถ้าหากแผนกของคุณเหมือนกับองค์กรส่วนใหญ่แล้วละก็   คุณคงแยกตรรกะทางธุรกิจและ/หรือตรรกะสำหรับเรียกใช้ข้อมูลไปเป็นคอมโพเน้นต์แยกจากกัน หรือชุดของคอมโพเน้นต์ต่างๆอยู่แล้ว ในขณะที่ไฟล์ ASP.NET ที่เหลือ, ASPX และโค้ดที่อยู่เบื้องหลังเก็บเฉพาะตรรกะที่ใช้ในการแสดงผลเท่านั้น    อย่างไรก็ตามแม้แต่ตรรกะที่ใช้ในการแสดงผลก็ยังสมควรนำกลับมาใช้ใหม่ได้ในกรณีที่เป็นไปได้  ดังนั้นครั้งหน้าถ้าหากมีผู้ใช้มาเคาะประตูของคุณแล้วบอกว่า  "ผมอยากได้แอพพลิเคชันที่มีหน้าตาเหมือนกับแอพพลิเคชันที่ซูซี่แผนกบัญชีใช้อยู่"   คุณสามารถสร้างแอพพลิเคชันให้แก่ผู้ใช้คนนี้ได้อย่างรวดเร็ว   โดยการนำเอาองค์ประกอบที่ใช้ในการแสดงผลบางส่วนของแอพพลิเคชันแผนกบัญชีมาใช้  หรือบางทีคุณอาจต้องการนำเอาโค้ดมาทำเป็นแพกเก็จเพื่อขายผ่านเว็บหรือแจกจ่ายทางเว็บไซต์ของคุณก็ได้  ASP.NET  ทำให้งานนี้ง่ายกว่าเดิมมาก  เนื่องจากมันช่วยให้คุณสร้างเซิร์ฟเวอร์คอนโทรลของคุณเองขึ้นมาได้ หรือดึงมาจากประเภทที่มีอยู่เพื่อช่วยให้คุณได้ฟังก์ชันที่ต้องการก็ได้

 แนวทางของ DropDownList

สมมติว่าคุณกำลังแก้ไขดาต้าเบส  Northwind  ใน  Microsoft  SQL  Server  อยู่ และคุณต้องการทำให้ผู้ใช้ (สมมติว่าชื่อ Ed ซึ่งเป็นผู้จัดการแผนกจัดซื้อ) สามารถแก้ไขตารางคำสั่งซื้อได้ ฟิลด์อันหนึ่งเก็บข้อมูลการส่งสินค้าเอาไว้  (ShipVia) ซึ่งเป็นสิ่งที่ Ed ต้องการแก้ไขได้ โดยในช่วงที่ทำการแสดงผล ชื่อของบริษัทขนส่งควรแสดงผลเป็นข้อมูลธรรมดา ถ้าหาก Ed คลิกที่ปุ่ม Edit คุณไม่เพียงแต่ต้องการให้เขาสามารถแก้ไขรหัสวิธีการขนส่ง (1,2, หรือ 3)  ใน  TextBox  ได้เท่านั้น  แต่คุณยังต้องการให้เขาเห็น DropDownList ที่เก็บชื่อของบริษัทขนส่งซึ่งเขาสามารถเลือกมาใช้ได้ด้วย (Ed จำไม่ได้ว่าบริษัทขนส่งแต่ละบริษัทใช้วิธีการขนส่งแบบใดบ้าง ดังนั้นวิธีนี้จะช่วยเขาได้อย่างมาก)

 คอลัมน์ Datagrid ภายใน

เมื่อเราได้รับโจทย์แล้ว ก่อนอื่นเราต้องทำทบทวนคอลัมน์ 5 ประเภทที่ Datagrid สร้างขึ้นมาใน ASP.NET รวมทั้งคลาส parent อย่าง DataGridColumn เสียก่อน

  • BoundColumn:   ใช้สำหรับแสดงผลฟิลด์ที่เป็นข้อความมาตรฐานโดยเฉพาะ  คอลัมน์นี้จะแสดงผลข้อความธรรมดา แต่จะแปลงไปเป็น  TextBox  เมื่อ Datagrid เข้าไปอยู่ในโหมด Edit ได้ นอกจากนั้นคุณยังสามารถทำฟอร์แมทบางอย่างได้ด้วย
  • HyperlinkColumn:  คอลัมน์นี้ใช้สำหรับแสดงผลข้อมูลที่เป็นข้อความ  ซึ่งใช้เป็นตัวแทนของเว็บแอดเดรส (URL) โดยที่  URL อาจจะเหมือนหรือไม่เหมือนข้อความที่แสดงอยู่ก็ได้ ข้อความทั้งสองแบบสามารถกำหนดได้โดยอิสระ การแสดงผลจะอยู่ในรูปของ <a href=...> tag
  • ButtonColumn:  คอลัมน์จะยอมให้ผู้ใช้โต้ตอบกับกริดผ่านทางแถวต่างๆ  โดยที่คุณอาจแสดงผลเป็น LinkButton แบบไฮเปอร์ลิงก์  (<a href=...>) หรือ Pushbooton (<input type = "button">) ก็ได้ PostBack จะเริ่มทำงานเมื่อมีการคลิกที่ปุ่มตามด้วยการทำงานของ ItemCommand event ใน Datagrid
  • EditCommandColumn:    คอลัมน์นี้คล้ายคลึงกับ   ButtonColumn   แต่มันจะสร้างปุ่มต่างๆขึ้นมาเพื่อใช้แก้ไข Datagrid  โดยเฉพาะ  รวมทั้งใช้ยกเลิกหรือส่งการเปลี่ยนแปลงที่เกิดขึ้นออกไป  ItemCommand  จะเริ่มทำงานตามด้วยเหตุการณ์คลิกปุ่มต่างๆเช่น EditCommand, CancelCommand หรือ UpdateCommand
  • TemplateColumn:  ใช้สำหรับควบคุมว่าจะแสดงผลคอนโทรลอะไรให้ผู้ใช้ดูบ้าง  โดยแบ่งออกเป็นเทมเพล็ตต่างๆ อาทิเช่น  ItemTemplate  และ  EditItemTemplate  คุณสามารถใส่คอนโทรล ASP.NET หรือ HTML หรือชุดของคอนโทรลลงไปในเทมเพล็ตเหล่านี้ได้

หมายเหตุ:     ก่อนที่คุณจะทำงานกับคอลัมน์ประเภทต่างๆเหล่านี้โดยตรง    คุณต้องตรวจสอบให้แน่ใจว่าปิด    "การสร้างคอลัมน์อัตโนมัติตอนรันไทม์"  (AutoGenerateColumns)  แล้ว จากนั้นคุณสามารถทำงานกับคอลัมน์แต่ละประเภทเหล่านี้ได้ใน Property Builder หรือเขียนโค้ด HTML โดยตรงสำหรับไฟล์ ASPX ก็ได้

 วิธีการแบบเก่า: DropDownList ใน TemplateColumn ก่อนที่จะเข้าไปเกี่ยวข้องกับการสร้างคอลัมน์ชนิดใหม่ขึ้นมา  ก่อนอื่นคุณต้องดูว่าจะแก้ปัญหารายการดรอปดาวน์ได้โดยที่ไม่ต้องใช้คอลัมน์พิเศษใดๆหรือไม่  โดยการทำงานกับ  DropDownList ที่อยู่ภายใน Templatecolumn โดยตรง ItemTemplate  จะเก็บเฉพาะข้อความธรรมดาที่เป็นตัวแทนของค่าปัจจุบัน  ในขณะที่  EditItemTemplate จะมีคอนโทรล <asp:DropDownList> ที่คุณนำไปดัดแปลงตอนรันไทม์ได้** code ** โค้ดสำหรับการเชื่อมโยง Datagrid:** code ** การเชื่อมโยง  DropDownList กับ item ที่กำลังแก้ไขเกิดขึ้นในช่วง ItemDataBound event ของ Datagrid โดยเมื่อตอนที่คุณใช้  ItemDataBound  event คุณต้องตรวจสอบให้แน่ใจว่ามีการตรวจสอบ ListItemType ของ Item  ปัจจุบันแล้ว  มิฉะนั้นแล้ว  คุณจะหลุดไปทำงานกับ Header Item หรือ item ประเภทอื่นๆที่ไม่เหมาะสมได้ คุณต้องอ้างอิงไปยังคอนโทรล  DropDownList  เพื่อใช้กับ EditItem ซึ่งถ้าหากดูจากตัวอย่างโค้ดด้านล่างนี้ ดิฉันได้แสดงวิธีการใช้  control  collection  ของเซลโดยตรง (เพื่อให้สอดคล้องกับตัวอย่างอื่นๆในภายหลัง) แต่คุณก็สามารถทำเองได้โดยง่ายโดยการกำหนด  ID  ให้แก่คอนโทรล DropDownList และค้นหาตัวอ้างอิงคอนโทรลโดยใช้  FindControl  method  ของ DataGrid item นั้นๆ การที่ Datagrid เชื่อมโยงกับการแสดงผลเริ่มต้นของ DataTable ดังนั้นองค์ประกอบแต่ละอันของการแสดงผลดังกล่าวจึงกำหนดเป็นประเภท DataRowView และคุณสามารถโอน  Data Item property ของ item ปัจจุบันไปให้ instance ของ DataRowView ได้ วิธีการนี้จะช่วยให้คุณอ้างอิงถึงฟิลด์ใน  DataItem โดยตรงโดยใช้ชื่อฟิลด์ ให้คุณใช้เทคนิคนี้ตามด้วยการจัดเก็บค่าปัจจุบันของ "Ship Via" เอาไว้ในเรกคอร์ดนี้แล้วใช้ค่าดังกล่าวเพื่อเลือกรายการดรอปดาวน์ที่เหมาะสมต่อไป** code ** และท้ายสุด โค้ดที่ใช้เรียกค่าปัจจุบันที่เลือกเอาไว้จาก DropDownList แล้วระมวลผลอัพเดตย้อนกลับไปหาดาต้าเบส

** code **

 

จ้าวแห่งคอลัมน์ทั้งมวล: DataGridColumn ขอย้อนกลับมาทบทวนคลาส  parent ของประเภทคอลัมน์ในตัวทั้งหมดกันก่อน คลาสที่ว่าก็คือ DataGridColumn นั่นเอง  (ดูภาพที่  1) คลาสนี้มี properties และ method ที่ใช้กับคอลัมน์ทั้งหมดของ Datagrid ดิฉันได้ใส่เครื่องหมายดาว (*) ข้างชื่อ properties ของ method ที่คุณจะนำไปใช้กับคอลัมน์พิเศษซึ่งคุณสร้างขึ้นมาได้** table ** แนวทางการนำโค้ดกลับมาใช้ใหม่: การสร้าง DropDownColumnเรื่องแรกที่คุณต้องทำก็คือการสร้างโครงการ  Class  Library  ใหม่ขึ้นมาใน Microsoft Visual Studio .NET  แล้วตั้งชื่อว่า  MyCustomColumn ใส่คลาสใหม่ที่ชื่อ DropDownColumn ลงไป ตรวจสอบให้แน่ใจว่ามีการใส่ namespace ให้แก่ class definition แล้ว ดังนั้นโค้ดเบื้องต้นของคุณจะมีหน้าตาลักษณะนี้

** code **

 

กำหนด public properties อีก 4 อัน เพื่อใช้งานในลักษณะนี้ DataSource:    นี่เป็นชุดข้อมูลที่จะใส่ลงไปใน    DropDownList   ข้อมูลอาจเป็นอะไรก็ได้ที่ใช้อินเทอร์เฟซ ICollection ซึ่งสำหรับตัวอย่างที่ใช้ในบทความนี้ ดิฉันใช้ ArrayList และ DataView DataField:   นี่เป็นฟิลด์ในแหล่งข้อมูล  parent  ของ  Datagrid  ที่สอดคล้องกับข้อมูลที่เลือกเอาไว้ในรายการดรอปดาวน์  ตัวอย่างเช่นถ้าหาก DataSource เก็บข้อมูลชื่อรัฐเอาไว้ DataField อาจจะเป็นอะไรบางอย่าง อาทิ "StateCode" หรือฟิลด์ชื่ออะไรก็ตามทีตั้งเอาไว้ในตารางเพื่อใช้กับชื่อรัฐเหล่านี้ DataTextField:  นี่เป็นข้อความที่จะแสดงในรายการดรอปดาวน์ หรืออาจจะตรงหรือไม่ตรงกับค่าที่กำหนดเอาไว้ก็ได้ DataValueField: นี่เป็นค่าที่เป็นตัวแทนของรายการดรอปดาวน์แต่ละอัน โดยปกติแล้ว DataValueField มักจะเป็นเลขจำนวนเต็มหรือโค้ดอื่นๆ  ในขณะที่  DataTextField  เป็นคำอธิบายที่เป็นข้อความ  ที่ผู้ใช้จะเข้าใจความหมายได้ดีกว่า ขั้นต่อมาสร้างเหตุการณ์ขึ้นมาแทนที่   InitializeCell   ซึ่งเป็นเหตุการณ์ปกติของคอลัมน์   Datagrid  โดยที่ InitializeCell  เกิดขึ้นกับเซลตารางทุกอันในคอลัมน์เหมือนกับ ItemCreated event ที่ทำงานกับ Datagrid โดยตรง   ในตอนนี้คุณสามารถแก้ไขข้อความของเซลอาทิเช่นการกำหนด   HeaderText   และการเพิ่มคอนโทรล DropDownList  ที่คุณต้องการใส่ข้อมูลลงไป  นอกจากนั้นดิฉันยังได้เพิ่มตัวจัดการ DataBinding event ของเซลอีกด้วย   ซึ่งจำเป็นต้องประมวลผลต่างออกไปขึ้นอยู่ว่าแถวกำลังมีการแก้ไขอยู่หรือไม่   ส่วน   System.Web.UI.Control  ทุกอันมี DataBinding event เป็นของตนเอง และตรงจุดนี้ก็คือจุดที่คุณสามารถเรียกใช้ข้อมูลที่อยู่ในนั้นได้ ขณะที่ข้อมูลถูกเชื่อมโยงไปหาคอนโทรล ซึ่งในกรณีนี้ก็คือออปเจ็กต์ TableCell ที่อยู่ภายใน Datagrid** code ** ขั้นต่อมาก็คือรูทีน  ItemDataBinding  ซึ่งจะเริ่มทำงานเมื่อแต่ละ  Item  หรือ  Alternating Item ที่อยู่ใน Datagrid  มีการเชื่อมโยงกับข้อมูล ในตอนนี้คุณจำเป็นต้องอ้างอิงกลับไปยัง TableCell ที่มีการเชื่อมโยงข้อมูลอยู่ ซึ่งคุณสามารถทำในรูปของการส่งออปเจ็กต์     "sender"     ไปยังเหตุการณ์ก็ได้     บวกกับการอ้างอิงไปยัง DataGridItem  ปัจจุบัน โดยใช้ NamingContainer property ของ TableCell ซึ่งจากจุดนี้คุณสามารถแสดงผลข้อมูลของ  DataField  เป็นข้อความธรรมดา  เหมือนในกรณีที่ฟิลด์นี้ถูกนำไปแสดงผลใน  BondColumn  ก็ได้ ท้ายสุดดิฉันมักจะส่งคำเตือนฉันท์มิตรออกไปถ้าหากฟิลด์ที่พวกเขากรอกลงไปไม่มี  มิฉะนั้นแล้ว  พวกเขาจะได้คำเตือนแบบกว้างๆว่า "อินเดกซ์อยู่นอกขอบเขต" เท่านั้น** code ** ขั้นต่อมาคุณต้องเขียนโค้ดสำหรับ  EditItemDataBinding event ซึ่งจะเกิดขึ้นกับเซลคอลัมน์พิเศษของเรา เมื่อมีแถวใดแถวหนึ่งเข้าสู่โหมด  Edit  คุณต้องทำการอ้างอิงไปยังเซลปัจจุบันอีกครั้ง และใส่คอนโทรล DropDownList ลงไปในช่วง  InitializeCell  method ให้คุณใส่รายการว่างๆเป็นตัวเลือกแรกของ DropDownList โดยจะมีการเลือกรายการนี้ถ้าหากข้อมูลที่อยู่ในคอลัมน์ปัจจุบันไม่ตรงกับ item ที่คุณใส่เอาไว้ในรายการจากชุด DataSourceจากนั้นคุณจำเป็นต้องกำหนดประเภทของชุดข้อมูลที่ส่งเข้ามา     ซึ่งในจุดมุ่งหมายของตัวอย่างนี้     ดิฉันจะจัดการกับสองกรณี  ก็คือชุดของสตริงที่ส่งเข้ามาในรูปของ ArrayList หรือ DataView จากตารางข้อมูล ที่ใช้เป็น item ที่อยู่ใน  DataRowView  ถ้าหากเป็นข้อมูลสตริง ดิฉันจะใส่ ListItem ใหม่ลงไป จากนั้นกำหนดทั้งค่าและข้อความของรายการดรอปดาวน์  ข้อความอธิบายเป็นสิ่งที่จำเป็นอย่างมากตรงจุดนี้ เนื่องจากเหตุการณ์ทั้งสองเหมือนกัน แต่ดิฉันจะเลือก   item   ที่เหมาะสมโดยดูจากค่าเพื่อให้สอดคล้องกับตัวอย่างต่อไป   ซึ่งจะเป็นการกำหนด   value property    แยกต่างหาก    ส่วน   DataRowView   item   ดิฉันเคยพูดเอาไว้ในตัวอย่างก่อนหน้านี้แล้วว่า DataRowViewInstance  ("FieldName")  ส่งออปเจ็กต์ที่เป็นตัวแทนข้อมูลของฟิลด์กลับมา แนวทางเดียวกันนี้สามารถใช้ในการดึงค่าสำหรับ DataTextField และ DataValueFields ได้เช่นกันท้ายสุด  ใส่ข้อยกเว้นสองสามอย่างลงไปเพื่อจัดการกับความผิดพลาดพื้นฐานที่นักพัฒนาอาจจะทำเมื่อมีการใช้คอลัมน์ดังกล่าว  อาทิเช่นการส่งชื่อฟิลด์ที่ไม่ถูกต้องไปยัง  DataField  property หรือส่งประเภท DataSource ที่ไม่คอมแพตทิเบิลเข้ามาเป็นต้น ดิฉันเขียนโค้ดให้ข้อความลอยขึ้นไปข้างบน แต่หวังว่าถ้าหากเป็นแอพพลิเคชันจริงแล้ว คุณควรที่จะเก็บข้อความเหล่านี้เอาไว้ในจุดที่แก้ไขได้ง่ายกว่า  อาทิเช่นในไฟล์  web  config เป็นต้น หรือเก็บเอาไว้ในไฟล์ทรัพยากร   ถ้าหากคุณต้องการใช้แอพพลิเคชันแบบโกบอล   นอกจากนั้นคุณไม่จำเป็นต้องใส่คำเตือน   "ไม่เจอ DataField  ที่ระบุเอาไว้ตรงนี้ เนื่องจาก ItemDataBinding event จะเป็นตัวจัดการเรื่องนี้อยู่แล้ว ก่อนที่ Datagrid จะถูกใส่ลงไปในโหมด Edit

** code **

 

การใช้ DropDownColumn ในตอนนี้เมื่อคุณเห็นโค้ดที่จำเป็นทั้งหมดสำหรับการสร้างคลาส DropDownColumn แล้ว ถ้าอย่างนั้นเราลองมาดูกันว่าจำเป็นต้องทำอะไรบ้าง  เพื่อนำเอาคอนโทรลตัวนี้ไปใช้ในแอพพลิเคชัน ถ้าหากคุณอ่านบทความนี้ที่บ้านและไม่เคยลองเขียนโค้ดตามบทความนี้มาก่อน      ให้คุณสร้าง      namespace      ตามตัวอย่างด้านบนไปใส่เอาไว้ในไฟล์ MyCustomColumn.dll  แล้วก็อปปี้ไปใส่ไว้ในโฟลเดอร์  /bin  ของแอพพลิเคชันที่คุณต้องการทดสอบ ในขณะที่ตัวอย่างของดิฉันเป็นการสร้างเว็บแอพพลิเคชันใหม่ขึ้นมาชื่อ   UseCustomColumn   แล้วเพิ่มการอ้างอิงลงไปในไฟล์ MyCustomColumn.dll   ที่อยู่ในไดเรกทอรี  /bin  ซึ่งบริเวณด้านบนสุดของไฟล์  ASPX  ให้ใส่  @Register directive ลงไปด้วย** code ** หมายเหตุประเภทคอลัมน์ชนิดใหม่จะไม่ปรากฏใน  Visual  Studio  .NET  Property  Builder สำหรับ Datagrid  ตัวนี้ ดังนั้นคุณต้องเข้าไปในหน้าจอ HTML แล้วใส่การกำหนดคอลัมน์เอาไว้ตรงนี้ คุณต้องตรวจสอบให้แน่ใจว่าการกำหนด  Datagrid มีการใส่ <from runat = "server">...</form> tags ลงไปด้วย ซึ่งเป็นสิ่งที่จำเป็นสำหรับจัดการกับ PostBacks ไฟล์ ASPX ที่เหลือจะมีหน้าตาแบบนี้** code ** Datagrid  จะถูกเชื่อมโยงเข้าหาตาราง  Orders ตามตัวอย่าง Northwind และ DropDownColumn พิเศษจะเชื่อมโยงเข้าหาคอลัมน์  ShipVia  ในตอนนี้สิ่งที่ดิฉันต้องทำก็คือการกำหนด  DataField  property ขณะที่ดิฉันเชื่อมโยงเข้าหา  ArrayList แบบง่ายๆ ในขณะที่ DataTextField และ DataValueField properties ไม่จำเป็น การกำหนดออปชัน ArrayList จะง่ายขึ้นอีกมาก ถ้าหากคุณมีรายการข้อมูลที่ไม่มีการเปลี่ยนแปลงกำหนดเอาไว้ก่อนแล้ว  หรือคุณอาจกำหนดออปชันขึ้นมาใหม่เองก็ได้ การกำหนด DataSource สำหรับ DropDownColumn จะอยู่ในรูปของโค้ด ก่อนอื่นคุณต้องทำการอ้างอิง DropDownColumn เสียก่อน** code ** ขั้นต่อมา   ดิฉันต้องแปลงตัวอย่างนี้เพื่อให้ใช้ข้อมูลสดๆจากตารางดาต้าเบสได้   โดย   ShipVia  กำหนดให้เป็น foreign    key    เพื่อค้นหาข้อมูลในตาราง   Shippers   ที่ดิฉันกำหนดให้เป็น   DataSource   สำหรับ DropDownColumn  ในโค้ดนี้ นอกจากนั้นดิฉันยังจำเป็นต้องแก้ไขการกำหนดตัวแปรใน DropDownColumn ให้มีการใส่ชื่อ DataTextField และ DataValueField ที่สอดคล้องกับฟิลด์ในตาราง shippers ลงไปด้วย** code ** จากนั้นทำการเชื่อมโยงตาราง Orders เข้าหา Datagrid และสร้าง Shippers เข้าหาคอลัมน์พิเศษ** code ** เมื่อได้รับข้อมูลแล้ว  DataGridColumn จะเลือก item ที่เหมาะสมจาก DropDownList เองโดยอัตโนมัติ โดยดูจากค่าต่างๆ (1,2 หรือ 3) ในตาราง Orders แบบนี้ขั้นตอนสุดท้ายของการใช้  DropDownColumn ก็คือการดึงค่าที่เลือกเอาไว้ให้ส่งกลับไปอัพเดตดาต้าเบส วิธีการก็คือแค่ทำการอ้างอิงไปยังคอนโทรล  DropDownList  ที่อยู่ภายในเซลเท่านั้นเอง  จากนั้นกำหนด  SelectedValue property ด้วย

** code **

 

สรุป ทั้งหมดนี้ก็คือการสร้างประเภทคอลัมน์ชนิดใหม่ขึ้นมาจาก  DataGridColumn ซึ่งในขณะที่สร้างขึ้นมาก็ให้ทำการเชื่อมโยงข้อมูลไปพร้อมๆกันด้วย  จากนั้นคุณก็สามารถนำโค้ดชุดนี้ไปใช้กับแอพพลิเคชันจริงได้แล้ว  นี่เป็นแค่ตัวอย่างหนึ่งของการนำเอาคอลัมน์  Datagrid  ไปใช้ซ้ำได้ สิ่งที่ถือเป็นความท้าทายที่รอคุณอยู่ก็คือการตรวจสอบแอพพลิเคชันของคุณเองว่ามีฟังก์ชันใดที่คุณมักใช้ซ้ำๆ  ซึ่งคุณสามารถนำไปสร้างเป็นคอลัมน์  Datagrid พิเศษของคุณเองขึ้นมาได้ คุณสามารถพัฒนาคอลัมน์ขึ้นมาใช้สำหรับงานพื้นฐานทั่วไป   อาทิเช่น  DropDownList  ในคอลัมน์หรือใช้เป็นฟังก์ชันพิเศษเฉพาะภายในองค์กรของคุณก็ได้  คุณไม่จำเป็นต้องจำกัดตัวเองโดยการใส่แค่คอนโทรล  ASP.NET ลงไปในคอลัมน์พิเศษของคุณเท่านั้น   คุณสามารถจัดทำโครงสร้างที่มีความซับซ้อนขึ้นมาได้  อาทิเช่นการนำเอาคอนโทรลอื่นๆ  ข้อมูลจากบริษัทอื่น  ๆหรือคอนโทรล  Datagrid  ทั้งหมดที่อยู่ภายในคอลัมน์ของคุณมาซ้อนกัน เพื่อสร้างเป็นข้อมูลที่แยกสาขาก็ได้ โดยคุณสามารถใช้จินตนาการได้อย่างอิสระประเภทคอลัมน์ในตัวทั้ง  5  ชนิดที่มีอยู่แล้วจัดเป็นสิ่งที่มีประโยชน์อย่างมาก คอลัมน์เหล่านี้สามารถสนองตอบต่อความต้องการในการแสดงผลส่วนใหญ่ได้ขณะที่ทำงานกับคอนโทรล   Datagrid   อย่างไรก็ตามถ้าหากคุณไม่ได้พัฒนาคอนโทรลของคุณเองขึ้นมา    คุณก็จะไม่มีโอกาสนำเอารูปแบบแปลกๆไปใช้ใน    TemplateColumn   อย่างอิสระได้ การสร้างคอลัมน์พิเศษขึ้นมาจะช่วยให้คุณเป็นอิสระจากข้อจำกัดเหล่านี้   และคุณจะมีโอกาสเพิ่มฟังก์ชันชั้นยอดลงไปในแอพพลิเคชัน Datagrid ของคุณได้

 

แหล่งข้อมูลอ้างอิง MetaBuilders.com: คอลัมน์ Datagrid พิเศษแจกฟรี รวมทั้งซอร์ซโค้ดด้วย (C#) DatagridGirl.com: ความรู้ทุกอย่างเกี่ยวกับ Datagrid

ASP.NET Data Web Controls แต่งโดย Scott Mitchell, SAMS, 2003, ISBN 0672325012

Filed under:
No Comments

Leave a Comment

(required)  
(optional)
(required)  
Add