Master Detail with LINQ DataSource


 

ใช้กับ

  • Visual Studio 2008
  • Microsoft SQL Server 2005 EXPRESS
  • .NET Framework 3.5

บทนำ

จากบทความที่ผมเขียนตีพิมพ์ลง นิตยสาร CODE IT [สอดอยู่ในเล่ม Windows ITPro ฉบับเดือน กรกฎาคม 2551] ซึ่งผมได้ขออนุญาตในการนำบทความไปเผยแพร่จากทางสำนักพิมพ์เป็นที่เรียบร้อยแล้ว ติดตามกันได้เลยครับ:

ถ้ากล่าวถึงเครื่องไม้เครื่องมือที่ใช้สำหรับการพัฒนาแอพพลิเคชันในยุคปัจจุบันนี้ คงต้องกล่าวถึงเครื่องมือมีระดับอย่าง VS2008 เป็นแน่แท้ หากผู้อ่านลองหลับตา แล้วคิดย้อนกลับไปในอดีตสมัยยุคของ Visual Studio 6.0 เรื่อยมาถึงยุคที่เรียกว่า .Net ครองโลก(ความเห็นส่วนตัวของผู้เขียน) คือในยุคที่ Microsoft ได้พัฒนา .Net Framework และ Web Services ด้วยคอนเซ็ปท์ที่ว่า ให้โลกทั้งใบเสมือนระบบปฏิบัติการ(OS) 1 ตัว Web Service เสมือนฟังก์ชัน และเว็บไซต์ หรือโปรแกรมเดสก์ทอปต่างๆ เสมือนแอพพลิเคชัน ที่สามารถเรียกใช้บริการจากฟังก์ชันใน OS ใบนี้ และเครื่องมือที่ใช้พัฒนาแอพพลิเคชันในยุคนั้นคือ Visual Studio 2003 (VS2003) ซึ่ง VS2003 ได้เข้ามาเปลี่ยนแปลงวิถีชีวิตของเหล่านักพัฒนาให้ดูสดใสยิ่งขึ้น (มีเวลาให้กับครอบครัวมากขึ้น) เรียกได้ว่ายุคสมัยนั้น (ยุคสมัย VS2003) อิริยาบถของเหล่านักพัฒนาดูสวยงามมากขึ้น

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

สำหรับการทำงานกับข้อมูลยุคสมัยอดีต การจะดึงข้อมูลอะไรบางอย่าง?… เพื่อมาแสดงบนคอนโทรล เช่น ComboBox เป็นเรื่องที่ยุ่งยากเอาการทีเดียว มีหลายขั้นตอน เช่น มีการประกาศตัวแปรสตริงเพื่อเก็บคอนเนคชัน ต้องเขียนคำสั่งเปิดคอนเนคชันเพื่อเชื่อมต่อฐานข้อมูล ต้องเขียนคำสั่ง SQL สเตทเมนต์เพื่อดึงข้อมูลอะไรบางอย่าง?… นั้น จากนั้นจึงจัดการ(Execute) และอ่านข้อมูลด้วย DataSet เพื่อดึงข้อมูลจากฐานข้อมูลแล้วจึงทำการผูกข้อมูล(Binding) ให้กับคอนโทรลตามที่เราต้องการ เราต้องทำงานซ้ำๆ ไมโครซอฟท์จึงพัฒนาภาษาใหม่เพื่อลดการทำงานซ้ำๆ ดังกล่าว นั่นคือ LINQ (Language Integrated Query) เรามาดูตัวอย่างโค้ดเพื่อเทียบเคียงระหว่างโค้ดสมัยอดีต และโค้ดสมัยใหม่กันครับ

โค้ดสมัยอดีต

//ประกาศตัวแปรสตริงเพื่อเก็บคอนเนคชันสตริง
string strConn = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;
          Persist Security Info=True;User ID=sa;Password=pass "
;
 

//ประกาศตัวแปร SqlConnection
SqlConnection connection = new SqlConnection (strConn); 

//เปิดคอนเนคชัน

if (connection.State.ToString()=="Closed") 

connection.Open (); 

//SQL สเตทเมนท์เพื่อดึงข้อมูลอะไรบางอย่าง?…

//ในบทความนี้ดึงข้อมูล Categories

string sql="select * from Categories"; 

//ประกาศตัวแปร DataSet

DataSet ds; 

ds= new DataSet (); 

//ประกาศตัวแปร SqlDataAdapter

SqlDataAdapter da; 

da= new SqlDataAdapter (sql,connection); 

//บรรจุข้อมูลให้ DataSet

da.Fill (ds); 

//==========================================

//ผูกข้อมูล(Binding) ให้กับคอนโทรล comboBox1
//==========================================

//ถ้าใน DataSet มีข้อมูล

if(ds.Tables[0].Rows.Count>0) 

{ 

comboBox1.DataSource = ds.Tables [0]; 

comboBox1.DisplayMember = "CategoryName"; 

comboBox1.ValueMember ="CategoryID"; 

} 

//==========================================

//ผูกข้อมูล(Binding) ให้กับคอนโทรล dataGrid1

//==========================================

sql="select * from Products"; 

SqlCommand command = new SqlCommand (sql, connection); 

ds = new DataSet (); 

da = new SqlDataAdapter (sql,connection); 

da.Fill (ds); 

if(ds.Tables [0].Rows.Count>0) 

{ 

dataGrid1.DataSource =ds.Tables [0]; 

} 

โค้ดสมัยใหม่(LINQ)

//ผูกข้อมูล(Binding) ให้กับคอนโทรล ComboBox

DataClasses1DataContext db = new DataClasses1DataContext(); 

comboBox1.DataSource = db.Categories; 

comboBox1.DisplayMember = "CategoryName"; 

comboBox1.ValueMember = "CategoryID"; 

//ผูกข้อมูล(Binding) ให้กับคอนโทรล DataGridView 

DataClasses1DataContext db = new DataClasses1DataContext(); 

dataGridView1.DataSource = db.Products;

 

จากโค้ดด้านบนเป็นการเทียบเคียงระหว่างโค้ดสมัยเก่า ที่เราต้องเขียนโค้ดซ้ำๆ ในการทำงานกับข้อมูล กับโค้ดสมัยใหม่ที่ใช้ LINQ (สำหรับความรู้เรื่อง LINQ ท่านผู้อ่านสามารถศึกษาได้จากเอกสารอ้างอิง LINQ: ) โค้ดสมัยเก่ากว่าจะดึงข้อมูล และผูกข้อมูลให้คอนโทรลหนึ่งคอนโทรลได้นั้นเล่นเอานักพัฒนาเหงื่อตกไปเลยทีเดียว มายุคสมัยนี้เครื่องมือมีระดับอย่าง VS 2008 เริ่มฉลาดขึ้นนั่นคือนักพัฒนาไม่จำเป็นต้องเขียนโค้ดยาวหลายสิบ หลายร้อยบรรทัดเหล่านั้นเพื่อเพียงแค่ต้องการผูกข้อมูลให้คอนโทรลหนึ่งตัวเท่านั้น ท่านผู้อ่านลองเทียบเคียงดูระหว่างโค้ดสมัยอดีต และโค้ดสมัยใหม่(LINQ) ท่านผู้อ่านรู้สึกมีความสุขขึ้นบ้างแล้วใช่ไหมครับ(โค้ดสั้นกว่ากันมาก) แต่ VS2008 ยังมีดีกว่านั้น (ซึ่งจะกล่าวถึงในหัวข้อถัดไป) โค้ดสมัยอดีตเหล่านั้น VS2008 สามารถทำแทนเราได้ (แม้ไม่ใช่แฟนก็ตามที) เพียงแค่เรา คลิก – ลาก – แล้ววางให้ตรงเป้าหมาย VS2008 จะทำการผูกข้อมูลให้กับคอนโทรล อย่างอัตโนมัติ โดย:

  • คลิก คือ ใช้เมาส์คลิกบนอ็อบเจ็กต์ Data Source
  • ลาก คือ ลากอ็อบเจ็กต์ Data Source
  • วางให้ตรงเป้าหมาย คือ ลากอ็อบเจ็กต์ Data Source ไปวางให้ตรงคอนโทรล (คอนโทรลคือเป้าหมายของเรา)

เราก็สามารถบรรลุตามเป้าหมายนั้นๆ ได้อย่างน่าอัศจรรย์ และความน่าอัศจรรย์ดังกล่าวจึงเป็นที่มาของบทความนี้ เราจะมาทำการดึงข้อมูลอะไรบางอย่าง?.. เพื่อผูกข้อมูลเหล่านั้นเข้ากับคอนโทรล ข้อมูลอะไรบางอย่างนั้นคือ ข้อมูลแบบแม่ และลูก(Master Detail) โดยใช้ฐานข้อมูล Northwind บน SQL Server 2005 EXPRESS ใช้ตาราง Categories (ประเภทสินค้า) และตาราง Products (สินค้า) โดยตาราง Categories เป็นตารางแม่ และตาราง Products เป็นตารางลูก ทั้งสองมีความสัมพันธ์แบบ 1:M (one to many) คือในหนึ่งประเภทสินค้า มีได้หลายสินค้า หรือหากเทียบเคียงกับชีวิตจริงสามารถกล่าวได้ดังนี้ คือเป็นความสัมพันธ์ระหว่างแม่และลูก กล่าวได้ว่าแม่หนึ่งคน สามารถมีลูกได้หลายคน แต่กลับกันลูกหนึ่งคนนั้นมีแม่ได้เพียงคนเดียว และหากเป็นความสัมพันธ์เป็นแบบ many to many อาจเทียบเคียงได้กับความสัมพันธ์ระหว่าง สามี-ภรรยา กล่าวคือสามีหนึ่งคนสามารถมีภรรยาได้หลายคน และภรรยาหนึ่งคนก็สามารถมีสามีได้หลายคนเช่นกัน แต่ท่านผู้อ่านทั้งหลายขอให้ความสัมพันธ์แบบ many to many จงบังเกิดขึ้นเฉพาะในการเก็บข้อมูล และในบทความนี้เท่านั้น อย่าได้บังเกิดขึ้นกับท่านผู้อ่านท่านหนึ่งท่านใดในที่นี้ …

หน้าตาแอพพลิเคชันของความสัมพันธ์แบบแม่และลูก(Master Detail) ดังภาพที่ได้บันทึกไว้แล้วในรูปที่ 1 หน้าตาแอพพลิเคชันความสัมพันธ์แบบแม่และลูก

 

1

รูปที่ 1. หน้าตาแอพพลิเคชันความสัมพันธ์แบบแม่และลูก

จากรูปที่ 1 กล่าวได้ว่า

ข้อมูลในตารางแม่(Categories) ผูกเข้ากับคอนโทรล ComboBox และข้อมูลในตารางลูก (Product) ผูกเข้ากับคอนโทรล DataGridView โดยเมื่อเราทำการเปลี่ยนข้อมูลแม่บนคอนโทรล ComboBox ข้อมูลลูกใน DataGridView ก็จะเปลี่ยนตามข้อมูลแม่มัน

เข้าสู่ขั้นตอนการพัฒนาแอพพลิเคชัน

ผู้เขียนขอแบ่งขั้นตอนการพัฒนาแอพพลิเคชันออกเป็นขั้นตอนต่างๆ หกขั้นตอนดังนี้

  • ขั้นตอนที่หนึ่ง: สร้างโปรเจ็ค
  • ขั้นตอนที่สอง: สร้าง LINQ to SQL Class
  • ขั้นตอนที่สาม: สร้างดาต้าซอร์ส (Data Source)
  • ขั้นตอนที่สี่: ผูกข้อมูลดาต้าซอร์ส เข้ากับคอนโทรล
  • ขั้นตอนที่ห้า: ทดสอบระบบ
  • ขั้นตอนที่หก: ประยุกต์การใช้งาน
  • ขั้นตอนที่หนึ่ง: สร้างโปรเจ็กต์

เปิดโปรแกรมเครื่องมือมีระดับของเหล่านักพัฒนาคือ VS2008 แล้วไปที่เมนู File จากนั้นเลื่อนเมาส์ลงมาเลือกเมนู New Project… และในหน้าต่าง New Project ช่อง Project types: ให้เลือก ภาษาที่ผู้อ่านถนัดในบทความนี้ ผู้เขียนขออนุญาตเลือกใช้ภาษาC# ให้คลิกเครื่องหมายบวกหน้า Visual C# คลิกลงบน Windows ช่อง Templates: ให้เลือก เทมเพลตโปรเจ็กต์ที่เป็น Windows Forms Application ในช่อง Name: ให้ตั้งชื่อโปรเจ็กต์ตามต้องการ ในบทความนี้ขออนุญาตตั้งชื่อโปรเจ็กต์เป็น WinMaster_Detail_LINQDataSource (ตั้งชื่อโปรเจ็กต์ให้สอดคล้องกับสิ่งที่เรากำลังทำงานอยู่)

ขั้นตอนที่สอง: สร้าง LINQ to SQL Class

เมื่อได้โปรเจ็กต์เป็นที่เรียบร้อย ให้สร้าง LINQ to SQL Class ตามภาพที่ได้บันทึกไว้แล้วในรูปที่ 2 สร้าง LINQ to SQL Class

 

2

รูปที่ 2. สร้าง LINQ to SQL Class

จากรูปที่ 2 กล่าวได้ว่า

  1. คลิกขวาบนโปรเจ็กต์ WinMaster_Detail_LINQDataSource
  2. เลื่อนเมาส์ลงมาเลือกเมนู Add
  3. เลือกเมนู New Item…
  4. ในหน้าต่าง Add New Item – WinMaster_Detail_LINQDataSource ช่อง Templates: ให้เลือก LINQ to SQL Class
  5. ในช่อง Name: ตั้งชื่อตามต้องการในบทความนี้ใช้ชื่อดีฟอลต์ DataClasses1.dbml
  6. คลิก Add เพื่อเพิ่ม Database Modeling (*.dbml) ต่อไปขอเรียกว่า dbml เข้ามาในโปรเจ็กต์

เมื่อเราเพิ่ม LINQ เข้ามาในโปรเจ็กต์เรียบร้อย VS2008 จะโชว์หน้าต่างพื้นที่ในการออกแบบ(Surface Design) ของ dbml ให้คลิกบน Server Explorer จะโชว์หน้าต่าง Server Explorer ให้เราทำการสร้างคอนเนคชันชี้ไปที่ฐานข้อมูล Northwind VS2008 จะทำการเจนเนอเรตคอนเนคชันสตริง(connectionStrings) เก็บไว้ในไฟล์ app.config จากนั้นกดปุ่ม Ctrl ค้างไว้แล้วใช้เมาส์ติ๊กเลือกตาราง Categories และตาราง Products แล้วลากไปวางบนหน้าต่างพื้นที่ออกแบบ dbml ดังบันทึกไว้แล้วในรูปที่ 3 การออกแบบ Database Modeling

 

3

รูปที่ 3. การออกแบบ Database Modeling

จากรูปที่ 3 กล่าวได้ว่า

เมื่อเราทำการออกแบบ Database Modeling เรียบร้อยให้ทำการบันทึกโดยคลิกไอคอนรูปดิสก์บนเมนูบาร์ของ VS2008 หนึ่งครั้งเพื่อให้ VS2008 เจนเนอเรตอ็อบเจ็กต์ต่างๆ โดยการแมป ตาราง Categories และตาราง Products เป็น อ็อบเจ็กต์ Categories และ Products เพื่อให้เราสามารถนำ อ็อบเจ็กต์ดังกล่าวไปใช้งานในหัวข้อถัดไป และ VS2008 จะทำการเก็บคอนเนคชันสตริงไว้ในไฟล์ app.config ซึ่งการเก็บคอนเนคชันสตริงไว้ในไฟล์คอนฟิกมีประโยชน์มากกรณีที่เราเปลี่ยนเครื่องซอร์ฟเวอร์ดาต้าเบส จากเครื่องพัฒนา(Develop) ไปเป็นเครื่องซอร์ฟเวอร์ที่ใช้งานจริง(Production) เราเพียงมาทำการแก้ไขเปลี่ยนแปลงค่าคอนเนคชันสตริงในไฟล์คอนฟิกในแท็ก <connectionStrings> แสดงดังไฟล์ app.config

ไฟล์ app.config

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

</configSections>

<connectionStrings>

<add

name="WinMaster_Detail_LINQDataSource.Properties.Settings.NorthwindConnectionString"

connectionString="Data Source=.SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=db_user;Password=db_pass"

providerName="System.Data.SqlClient" />

</connectionStrings>

</configuration>

 

ขั้นตอนที่สาม: สร้างดาต้าซอร์ส (Data Source)

เมื่อเราสร้าง LINQ to SQL Class เป็นที่เรียบร้อยเราจะได้อ็อบเจ็กต์ของตารางดังที่กล่าวไปแล้วก่อนหน้านี้ เป็นอ็อบเจ็กต์สองก้อนคือ อ็อบเจ็กต์ก้อนของ Categories และ อ็อบเจ็กต์ก้อนของ Products ถึงขั้นตอนนี้กล่าวได้ว่าเราได้สร้างอ็อบเจ็กต์ความสัมพันธ์ของแม่และลูกเป็นที่เรียบร้อยแล้ว ต่อไปให้ทำการสร้าง Data Source คือช่องทางเพื่อชี้ไปยังอ็อบเจ็กต์สองก้อนดังกล่าว ขั้นตอนการสร้างดังได้บันทึกเป็นภาพไว้แล้วในรูปที่ 4 ขั้นตอนการสร้างดาต้าซอร์ส จากก้อนอ็อบเจ็กต์

 

4

รูปที่ 4. ขั้นตอนการสร้างดาต้าซอร์ส จากก้อนอ็อบเจ็กต์

จากรูปที่ 4 กล่าวได้ว่า

  1. คลิกเมนู Data บนเมนูบาร์ของ VS2008 แล้วเลื่อนเมาส์ลงคลิกเมนู Show Data Source…
  2. ในหน้าต่าง Data Source คลิก Add New Data Source…
  3. ในหน้าต่าง Data Source Configuration Wizard เลือกประเภท Data Source เป็นแบบ Object
  4. ให้เลือกก้อนอ็อบเจ็กต์ที่มีนามว่า Category
  5. คลิก Next เพื่อได้ไปต่อ
  6. จากขั้นตอน 1 ถึง 5 เราจะได้ดาต้าซอร์ส ชื่อ Category ที่แสดงในหน้าต่างดาต้าซอร์ส

ในหน้าต่างดาต้าซอร์ส อ็อบเจ็กต์ Category จะเห็นว่าดีฟอลต์เป็นคอนโทรล DataGridView นั่นหมายความว่าถ้าเราลากอ็อบเจ็กต์ Category ก้อนนี้มาวางบนฟอร์ม VS2008 จะเจนเนอเรต คอนโทรล DataGridView พร้อมผูกข้อมูลให้เป็นที่เรียบร้อย แต่นั่นไม่ใช่สิ่งที่เป็นความต้องการของบทความนี้เสียทีเดียว เราต้องทำการปรับประเภทของคอนโทรลเพียงสักเล็กน้อย สิ่งที่ต้องการสำหรับบทความนี้คือ ความสัมพันธ์ระหว่างตารางแม่(Categories) และตารางลูก(Products) ซึ่งตารางแม่จะผูกเข้ากับคอนโทรล ComboBox และตารางลูกผูกเข้ากับคอนโทรล DataGridView ฉะนั้นเราต้องทำปรับประเภทอ็อบเจ็กต์ Category จากคอนโทรล DataGridView ไปเป็น คอนโทรล ComboBox ตามขั้นตอนที่บันทึกไว้แล้วในรูปที่ 5 ปรับอ็อบเจ็กต์ Category เป็นคอนโทรลประเภท ComboBox

 

5

รูปที่ 5. ปรับอ็อบเจ็กต์ Category เป็นคอนโทรลประเภท ComboBox

จากรูปที่ 5 กล่าวได้ว่า

ให้คลิกเมาส์ข้างขวาบนอ็อบเจ็กต์ Category จากนั้นเลื่อนเมาส์ลงมาเลือกเมนู Customize จะโชว์หน้าต่าง Option ขึ้นมาในช่อง Associated controls: ให้ทำการติ๊กถูกเลือก ComboBox แล้วคลิก OK เราจะได้ประเภทของคอนโทรล ComboBox ในอ็อบเจ็กต์ Category เพิ่มขึ้นมาอีกหนึ่งอย่าง

จากนั้นเราทำการเปลี่ยนประเภทคอนโทรลของอ็อบเจ็กต์ Category จากดีฟอลต์เป็น DataGridView ไปเป็น ComboBox โดยคลิกดรอปดาวน์บนอ็อบเจ็กต์ Category เลื่อนเมาส์มาเลือก ComboBox เป็นอันเสร็จสิ้นพิธีการเปลี่ยนประเภทคอนโทรลของอ็อบเจ็กต์ Category

 

ขั้นตอนที่สี่: ผูกข้อมูลดาต้าซอร์ส เข้ากับคอนโทรล

มาถึงขั้นตอนที่สี่เราก็สามารถสร้างข้อมูลจากข้อมูลที่อยู่ในรูปแบบตาราง ให้เป็นข้อมูลอยู่ที่เป็นก้อน อ็อบเจ็กต์ เพื่อช่วยให้เราสามารถทำงานง่ายๆ กับข้อมูลโดยผ่านทางก้อนอ็อบเจ๊กต์นี้ นี่คือสิ่งที่ VS2008 และ LINQ จัดการและทำแทนเหล่านักพัฒนา ให้เราทำการเปิด Form1 โดยในหน้าต่าง Solution Explorer ให้ดับเบิลคลิก Form1 VS2008 จะโชว์ Form1.cs[Design] ให้คลิกเมนู Data บนเมนูทูลบาร์ของ VS2008 จากนั้นเลือกเมนู Show Data Sources เพื่อแสดงหน้าต่างดาต้าซอร์ส ให้ทำการผูกอ็อบเจ็กต์ข้อมูล(Object Data Source) ให้กับคอนโทรลตามที่บันทึกไว้ในรูปที่ 6

การผูกอ็อบเจ็กต์ข้อมูลให้กับคอนโทรล

 

6

รูปที่ 6. การผูกอ็อบเจ็กต์ข้อมูล ให้กับคอนโทรล

จากรูปที่ 6 กล่าวได้ว่า

ให้ใช้หลักการดังที่ได้กล่าวไว้ว่า คลิก – ลาก – แล้ววางให้ตรงเป้าหมาย โดยคลิกเมาส์ค้าง

บนอ็อบเจ็กต์ Category แล้วลากไปวางบน Form1 จากนั้นกระทำบนอ็อบเจ็กต์ Product เช่นเดียวกัน วิธีการผูกข้อมูลเข้ากับคอนโทรลเป็นอันเสร็จเรียบร้อย (ง่ายดังพลิกฝ่ามือ)

จากนั้นเรามาเขียนโค้ดเพื่อบรรจุข้อมูล(Load) ให้คอนโทรลโดยดับเบิลคลิกบน From1 แล้วใส่โค้ด(สีแดง) สองบรรทัดนี้ลงไป

โค้ดบรรจุข้อมูลให้ categoryBindingSource

public Form1()

{

InitializeComponent();

DataClasses1DataContext db = new DataClasses1DataContext();

categoryBindingSource.DataSource = db.Categories;

}

 

จากโค้ดบรรจุข้อมูลให้ categoryBindingSource สามารถกล่าวได้ว่า

ตัวแปร db เป็นการสร้างอ็อบเจ็กต์ใหม่ของคลาส DataClasses1DataContext ซึ่งก็คือ Database Modeling ที่ได้จากการสร้าง LINQ ของเราก่อนหน้านี้

categoryBindingSource.DataSource = db.Categories; เป็นการโยนข้อมูลให้กับ categoryBindingSource (ซึ่งอ็อบเจ็กต์ categoryBindingSource ได้จากการเจนเนอเรตของ VS2008 ตอนเราลากอ็อบเจ็กต์ Category มาวางบน Form1) และวางโค้ดในส่วนของการผูกข้อมูลไว้ใน เมธอดคอนสตรักเตอร์ Form1() เพื่อให้ทำงานทันที่เมื่อมีการสร้างอ็อบเจ็กต์ Form1

 

ขั้นตอนที่ห้า ทดสอบระบบ

เมื่อเราเพิ่มโค้ดสองบรรทัดข้างบนลงเรียบร้อยแล้วแอพพลิเคชันของเราเป็นอันเสร็จสมบูรณ์

เรามาทำการทดสอบระบบกันครับว่าแม่และลูกมีความสัมพันธ์กันจริง ดังที่เราตั้งเป้าหมายเอาไว้ก่อนหน้านี้หรือเปล่า กด F5 เพื่อวิ่ง(Run) แอพพลิเคชันของเรากันเลย จะได้ผลดังรูปที่ 1 หน้าตาแอพพลิเคชันความสัมพันธ์แบบแม่และลูก

เห็นไหมละครับแม้ VS2008 ไม่ใช่แฟนแต่ทำแทนเหล่านักพัฒนาได้ โด้คยาวหลายสิบบรรทัดสมัยอดีต นักพัฒนาอย่างเราๆ ท่านๆ ไม่ต้องเขียนให้เหงื่อตกอีกต่อไป แล้วชีวิตของนักพัฒนาเริ่มสดใสขึ้น และดูดีขึ้นมีเวลาให้ครอบครัวมากขึ้น เริ่มมีความสุขกันบ้างหรือยังครับท่านผู้อ่าน

 

ขั้นตอนที่หก ประยุกต์การใช้งาน

หากว่าท่านผู้อ่านเกิดข้อสงสัยว่า ถ้าเราต้องการออกแบบฟอร์ม และคอนโทรลไว้ก่อน แล้วจึงทำการลากดาต้าซอร์ส มาผูกกับคอนโทรลนั้นสามารถทำได้หรือไม่ ?… ด้วยความสามารถของ VS2008 สามารถทำได้ครับ ตามมาดูกันต่อเลยครับ

ในโปรเจ็กต์เดิมของเราให้เพิ่มฟอร์มใหม่เข้ามา 1 ฟอร์มโดยคลิกขวาบน โปรเจ็กต์ WinMaster_Detail_LINQDataSource เลื่อนเมาส์ลงมาคลิกเมนู Add และคลิก เมนู Windows From… ตามลำดับ ท่านผู้อ่านสามารถตั้งชื่อ ฟอร์มตามต้องการ ในบทความนี้ขอใช้ชื่อดีฟอลต์เป็น Form2.cs จากนั้นทำการลากคอนโทรล comboBox และ คอนโทรล dataGridView มาวางบนฟอร์มสองแล้วใช้หลักการ คลิก – ลาก – แล้ววางให้ตรงเป้าหมาย ดังที่ได้กล่าวไปแล้วขั้นต้น ทำการลาก

อ็อบเจ็กต์ในหน้าต่างดาต้าซอร์ส มาวางบนฟอร์มสอง โดยวางให้ตรงเป้าหมายกล่าวคือลาก ออบเจ็ก Category มาวางบน comboBox1 และลากออบเจ็กต์ Products มาวางบน dataGridView1 ดังรูปที่ 7 การผูกอ็อบเจ็กต์ดาต้าซอร์ส กับคอนโทรลที่ออกแบบไว้ก่อน(1) จากทำการเพิ่มโค้ดสองบรรทัดตามโค้ดบรรจุข้อมูลให้ categoryBindingSource ส่วนที่เป็นสีแดง ที่ได้กล่าวไปแล้ว ก่อนหน้านี้ จากนั้นเรามาทำการปรับให้โปรเจ็กต์ของเราให้วิ่งฟอร์มสอง บนโปรเจ็กต์ WinMaster_Detail_LINQDataSource ให้เปิดคลาส Program.cs โดยดับเบิลคลิกลงบนไฟล์ Program.cs ทำการคอมเมนต์บรรทัด Application.Run(new Form1()); แล้วเพิ่มบรรทัด Application.Run(new Form2()); เพื่อให้แอพพลิเคชันของเราเปิดฟอร์มสองเป็นฟอร์มแรกตอนวิ่ง(run) โปรแกรม ดังนี้

 

คลาส Program.cs สั่งให้วิ่งฟอร์มสอง

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

//Application.Run(new Form1());

Application.Run(new Form2());

}

 

 7

รูปที่ 7. การผูกอ็อบเจ็กต์ดาต้าซอร์ส กับคอนโทรลที่ออกแบบไว้ก่อน(1)

วิ่ง(run) โปรแกรมเพื่อทดสอบการทำงานกันเลยครับ จะได้ผลดังรูปที่ 8

 

8

รูปที่ 8. ผลการผูกอ็อบเจ็กต์ดาต้าซอร์ส กับคอนโทรลที่ออกแบบไว้ก่อน(1)

แล้วถ้าหากท่านผู้อ่านยังไม่หายข้อสงสัย ถ้าเราใช้คอนโทรล dataGridView สองอันแสดงความสัมพันธ์ข้อมูลระหว่างตารางแม่ และตารางลูกล่ะ ทำได้หรือไม่ ?… ตามดูกันต่ออีกนิดครับให้เพิ่มฟอร์มสามมาอีกหนึ่งฟอร์ม แล้วลากคอนโทรล dataGridView สองอัน มาวางบนฟอร์มสามจากนั้นเราทำการผูกอ็อบเจ็กต์ดาต้าซอร์ส โดยลากอ็อบเจ็กต์ Category มาวางบน dataGridView อันบน(อันแรกเพื่อแสดงข้อมูลตารางแม่) ลากคอนโทรล Product มาวางบน dataGridView อันล่าง(อันที่สองเพื่อแสดงข้อมูลตารางลูก) ดังที่ได้บันทึกไว้ในรูปที่ 9. การผูกอ็อบเจ็กต์ดาต้าซอร์ส กับคอนโทรลที่ออกแบบไว้ก่อน(2) จากนั้นทำการเพิ่มโค้ดบรรจุข้อมูลให้ categoryBindingSource สองบรรทัดลงไปในฟอร์มสาม แล้วสั่งให้คลาส Program.cs วิ่งฟอร์มสามเป็นฟอร์มแรก โดยใส่โค้ดบรรทัด Application.Run(new Form3()); ลงไปแทน กด F5 ทดสอบโปรแกรมกันเลย จะได้ผลตามรูปที่ 10 ผลการผูกอ็อบเจ็กต์ดาต้าซอร์ส กับคอนโทรลที่ออกแบบไว้ก่อน(2) ผู้อ่านลองทดสอบใช้เมาส์คลิกข้อมูลแม่จะเห็นว่าข้อมูลลูกเปลี่ยนตาม เป็นไปตามความสัมพันธ์แม่และลูก (Master Detail) แบบ one to many

 

9

รูปที่ 9. การผูกอ็อบเจ็กต์ดาต้าซอร์ส กับคอนโทรลที่ออกแบบไว้ก่อน(2)

 

10

รูปที่ 10. ผลการผูกอ็อบเจ็กต์ดาต้าซอร์ส กับคอนโทรลที่ออกแบบไว้ก่อน(2)

 

บทสรุป

ถึงตรงนี้ท่านผู้อ่านคงหายสงสัย และเริ่มมีความสุขกันบ้างแล้วใช่ไหมครับ เราสามารถออกแบบฟอร์ม และคอนโทรลไว้ก่อน แล้วจึงทำการผูกข้อมูลให้คอนโทรลได้ โดยการ คลิก – ลาก – แล้ววางให้ตรงเป้าหมาย ซึ่งทั้งสองวิธีมีความแตกต่างกันที่ ในการลากอ็อบเจ็กต์ Data Source ไปวางบนฟอร์มโดยตรงโดยยังไม่มีคอนโทรลใดๆ นั่น VS2008 จะทำการเจนเนอเรตคอนโทรลให้ตามที่เรากำหนดประเภทของคอนโทรลในอ็อบเจ็กต์ดาต้าซอร์ส ที่เราได้รับทราบไปแล้ว และVS2008 ยังเจนเนอเรตเมนู Navigator ให้แบบอัตโนมัติด้วยเราสามารถเลื่อนข้อมูล ทำการเพิ่ม-แก้ไข-ลบข้อมูลได้จากเมนู Navigator นี้ได้ทันที ซึ่งผู้เขียนขออนุญาตไม่ขอกล่าวถึงในบทความนี้

การคลิก – ลาก – แล้ววาง เหมาะกับการทำงานกับข้อมูลที่ไม่ซับซ้อน อย่างเช่นข้อมูลหลัก(Master data) ที่มีการเพิ่ม(Insert) ปรับปรุงแก้ไข(Update) หรือลบ(Delete) ที่ใช้งานไม่บ่อยนัก

ด้วยเครื่องมืออย่าง VS2008 และหลักการคลิก – ลาก – แล้ววาง ได้ช่วยให้นักพัฒนาลดเวลาในการโค้ดดิ้ง การผูกข้อมูลให้คอนโทรล ซึ่งนักพัฒนาสามารถใช้เวลาอันสั้นในการพัฒนาแอพพลิเคชัน แม้โลกในทุกวันนี้จะหมุนเร็วขึ้น(การแข่งขันสูงขึ้น) การพัฒนาแอพพลิเคชันที่ต้องเร่งด่วน คือใช้เวลาการพัฒนาน้อย และดีที่สุด ก็ไม่ใช่เรื่องยากอีกต่อไปสำหรับนักพัฒนายุคใหม่อย่างท่านผู้อ่านทุกๆ ท่าน

หากเกิดข้อผิดพลาดประการใดในบทความนี้ ผู้เขียนยินดีน้อมรับคำแนะนำ และพร้อมแก้ไขในครั้งต่อๆ ไป

ท่านผู้อ่านสามารถพบปะผู้เขียนได้บนชุมชนออนไลน์ http://Greatfriends.biz ชุมชนที่มีความคึกคักสำหรับผู้ใช้เทคโนโลยีดอตเนต และบอร์ด http://aspnetthai.com ที่ให้ความรู้ในด้าน ASP.NET ในบ้านเมืองเรา

 

เอกสารอ้างอิง #ความรู้เรื่อง LINQ

 

Source:> นิตยสาร CODE IT [สอดอยู่ในเล่ม Windows ITPro ฉบับเดือน กรกฎาคม 2551]

เกี่ยวกับ

Nuchit Atjanawat is a Microsoft MVP, GreatFriends Community Leader, WindowsITPro Columnist(Mr.Nano), Silverlight Business Application Instructor, Speaker in various Microsoft events, Author, passionate Blogger and a Software Engineer by profession. He has a very good skill over Silverlight, LightSwitch, C#, XAML & Blend. He shares his technical findings, tutorials in his technical blog. Follow his Blog and Facebook page to be updated on latest articles. - Technical Blog: https://janawat.wordpress.com - WindowsITPro Columnist(Mr.Nano): http://windowsitpro.net - The GreatFriends.Biz Community Discussion Board (nano): http://greatfriends.biz - witter: https://twitter.com/janawat - Facebook Page: https://www.facebook.com/nuchit - Instructor: http://bit.ly/GF250-01, http://bit.ly/GF150-02

เขียนใน Windows Application

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

In Archive
%d bloggers like this: