เกริ่นนำ
บทความนี้จะอธิบายตัวอย่างการใช้งาน GridView โดยใช้เทคโนโลยี LINQ มาใช้งาน แบบที่ใช้งานได้จริงนะครับ ซึ่งจากตัวอย่างเราจะสร้างฟอร์มบน Window Form และใช้ BindingSource กับ Binding Navigator มาร่วมใช้งาน ส่วนโมเดลจะมาจากการสร้างจาก LINQ to SQL Class
ขั้นตอนการทำ
๑. การสร้าง LINQ to SQL Class
หลังจากสร้างโปรเจคใหม่ขึ้นมาแล้ว ให้สร้าง โฟลเดอร์ใหม่ ที่ชื่อ Models ขึ้นมา แล้วให้คลิ๊กขวาเลือก New Item ตามภาพด้านล่างนี้นะครับ
รูปที่ ๑ แสดงการสร้างคลาส LINQ to SQL Class
๒. การสร้างโมเดลข้อมูลจากตารางข้อมูล
เมื่อสร้างไฟล์ขึ้นมาแล้วให้เพิ่มตารางที่ต้องการ แล้ะสร้างความสัมพันธ์ให้กับตารางให้เรียบร้อย ตามภาพด้านล่างนี้
รูปที่ ๒ แสดงการสร้างความสัมพันธ์ระหว่างตาราง
ตัวอย่างการสร้างความสัมพันธ์ระหว่างตารางสามารถทำได้โดยคลิ๊กขวาที่พื้นที่สีขาว แล้วเลือก เมนู ADD -> Association
แล้วให้เลือกฟิลด์ที่เป็นคีย์หลักของแต่ละตารางให้เชื่อมโยงหากัน ตัวอย่างตามภาพนี้
แล้วให้เลือกฟิลด์ที่เป็นคีย์หลักของแต่ละตารางให้เชื่อมโยงหากัน ตัวอย่างตามภาพนี้
รูปที่ ๒.๑ แสดงการสร้างความสัมพันธ์ระหว่างตาราง
๓. การสร้างคลาสในการจัดการโมเดล
หลังจากเราสร้างไฟล์ดังกล่าวเสร็จแล้ว โปรเจกค์นี้จะมีไฟล์ App.Config เพิ่มเข้ามา ตามตัวอย่างโค้ดด่านล่างนี้
01 02 03 04 05 06 07 08 09 10 | <?xml version= "1.0" encoding= "utf-8" ?> <configuration> <configSections> </configSections> <connectionStrings> <add name= "LINQ_WINTEST.Properties.Settings.projectDBConnectionString" connectionString= "Data Source=ServerName;Initial Catalog=databaseName;Integrated Security=True" providerName= "System.Data.SqlClient" /> </connectionStrings> </configuration> |
ต่อจากนี้ให้เพิ่มคลาสมาใหม่อีกตัวหนึ่งเพื่อจัดการกับข้อมูลในโฟลเดอร์ Models นะครับชื่อ CompanyRespository.cs
ซึ่ง มีโค้ดดังนี้
ซึ่ง มีโค้ดดังนี้
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LINQ_WINTEST.Models { public class CompanyRespository { private DataClasses1DataContext db = new DataClasses1DataContext(); // //Query Method public IQueryable FindALL() { return db.Companies; } //Get Data public Company GetCompany( int id) { return db.Companies.SingleOrDefault(d=>d.Company_ID==id); } //Get MaxID public int GetMaxID() { int m = db.Companies.Max(a => a.Company_ID);</code> return m++; } // //Insert Delete Method. public void Add(Company company) { db.Companies.InsertOnSubmit(company); } public void Delete(Company company) { db.CompanyDepartments.DeleteAllOnSubmit(company.CompanyDepartments); db.CompanyDatas.DeleteAllOnSubmit(company.CompanyDatas); db.CompanyEmployees.DeleteAllOnSubmit(company.CompanyEmployees); db.Companies.DeleteOnSubmit(company); } // //Persistence public void Save() { db.SubmitChanges(); } } } |
จากโค้ดจะมี เมธอร์ดในการเข้าถึงข้อมูล หลายเมธอร์ดด้วยกัน เช่น FindALl(); คื่อเลือกข้อมูลทุกรายการจากตารางมาแสดง GetCompany(int id); เลือกข้อมูลบริษัทตามรหัสที่ระบุ , GetMaxID(); เลือกรหัสสูงสุดในตารางเพื่อมาสร้างรันนิ่งตัวเลขคีย์หลัก และอื่นๆ ที่จำเป็นต้องใช้
๔. สร้างวินโดว์ฟอร์ม
รูปที่ ๓ แสดงฟอร์มที่สร้างเสร็จแล้ว
ให้แมพ DataSource ของ dataGridView1 เป็น bindingSource1 แล้วอื่นๆ อีกหลายอย่างซึ่งผมว่าให้ท่านลองทำเองนะครับ มันเล็กๆ น้อยน่าจะพอสุ่มไปได้ เรามาดู Event Code กันเลยดีกว่าครับ โค้ดของฟอร์มมีดังนี้
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using LINQ_WINTEST.Models; namespace LINQ_WINTEST { public partial class Form1 : Form { private DataClasses1DataContext db = new DataClasses1DataContext(); private CompanyRespository query = new CompanyRespository(); public Form1() { InitializeComponent(); }</code> private void Form1_Load(object sender, EventArgs e) { var com = from company in db.Companies orderby company.Company_ID select company; bindingSource1.DataSource = com; } private void tsBunttonSave_Click(object sender, EventArgs e) { this .Validate(); db.SubmitChanges(); MessageBox.Show( "Save Complete" , "Save" , MessageBoxButtons.OK, MessageBoxIcon.Information); } private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e) { Company newcom = new Company(); newcom.Company_ID = query.GetMaxID()+1; newcom.Company_Name = "" ; query.Add(newcom); query.Save(); var com = from company in db.Companies orderby company.Company_ID select company; bindingSource1.DataSource = com; } private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e) { if (MessageBox.Show( "Are you sure to delete?" , "Confirm" , MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { bindingSource1.RemoveCurrent(); db.SubmitChanges(); } var com = from company in db.Companies orderby company.Company_ID select company; bindingSource1.DataSource = com; } private void toolStripButton1_Click(object sender, EventArgs e) { this .Close(); } } } |
รูปที่ ๔ แสดงการรันโปรแกรม
สรุป
หลังจากการเขียนโค้ดเสร็จจะเห็นรูปแบบการเขียนโดยใช้โค้ดควบคุมเองโดยไม่ใช้ bindingNavigator Event นะครับ การฝึกหัดทำจะยากหน่อยแต่จะยืดหยุ่นกว่าการใช้ Event ที่ Default มานะครับ
หลังจากการเขียนโค้ดเสร็จจะเห็นรูปแบบการเขียนโดยใช้โค้ดควบคุมเองโดยไม่ใช้ bindingNavigator Event นะครับ การฝึกหัดทำจะยากหน่อยแต่จะยืดหยุ่นกว่าการใช้ Event ที่ Default มานะครับ
No comments:
Post a Comment