Thursday, May 10, 2012

การใช้งาน GridView บน Window Form โดย C#, LINQ

เกริ่นนำ
บทความนี้จะอธิบายตัวอย่างการใช้งาน 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 มานะครับ

No comments:

Post a Comment