Archive
การสร้างตารางข้อมูลแบบ Hierarchy Data Structure เพื่อใช้กับ Treeview control
Treeview control เป็น control ที่ใช้บ่อยกับงาน Interface ที่แสดงข้อมูลในรูปแบบที่เป็น ระดับสัมพันธ์ กันหรือเรียกว่า Hierarchy Data Structure ซึ่งเป็นโครงสร้างแบบเดียวกับ Tree สำหรับ ผู้พัฒนาในระดับต้น มักต้องประสบปัญหาความยุ่งยากเมื่อนึกถึงโครงส้รางแบบนี้ ลองมาดูวิธีการตัวอย่างนี้เป็น แนวทางในการ ในการนำไปประยุกค์ใช้งานต่อไปนะครับ
ความต้องการในการใช้งาน หรือ Business Requirement
ตัวอย่างข้อมูลที่ต้องแสดงในลักษณะนี้ ก็อย่างเช่นการแสดงรายการสินค้าภายใต้กลุ่มสินค้าต่าง ๆ ซึ่งในบ้างครั้งการสร้างโครงสร้างข้อมูล ก็เป็นเรื่องท้าทายให้คิดนะครับ เนื่องจากข้อมูลที่เราใช้งานนั้นมีความเปลี่ยนแปลงเกิดขึ้นได้ตลอดเวลา รูปแบบโครงข้อมูลแบบได้ถึงจะเหมาะสมในการเก็บข้อมูลในลักษณะนี้ สำหรับมือเก่า ๆ ชั้นลายครามอาจจะมองดูว่า เป็นเรื่องหมูตุ๋น งายเสียนี่กระไร แต่มือใหม่หัดขับก็อาจจะมึน ๆ เมื่อเจอโจทย์แบบนี้นะครับ ลองพิจารณาดู จากภาพด้านล่างนี้นะครับ หากต้องการ เก็บข้อมูลและแสดงข้อมูลในรูปแบบนี้ โดยให้ข้อมูลอยู่ในฐานข้อมูล สามารถแก้ไขเปลี่ยนแปลงได้เราจะทำกันอย่างไร
การแก้ปัญหา
– สร้างโครงสร้างข้อมูลให้ได้ตาม รูปแบบที่ต้องการ (Hierarchical data)
– สร้าง logic ในการอ่านข้อมูล (Recursive Funciton)
– ส่งแสดงใน Treeview
โครงสร้างข้อมูลตัวอย่าง จากรูปด้านล่าง เรามี ตารางข้อมูล ทีมี field เป็น NODE_DESCRIPTION , NODE_ID, NODE_PARENT_ID
ให้ NODE_PARENT_ID เป็นข้อมูลบอก ว่า recode ไหน ที่เป็น parent ของมัน โดยดูที่ NODE_ID ครับ เท่านี้เราก็สามารถที่จะมีโครงสร้างตารางข้อมูล ที่จะแสดง กับ TreeView ได้แล้วนะครับ ซึ่งก็จะได้โครงสร้างดังนี้นะครับ
[ตารางชื่อ tblHierarchyTree – SqlServer Express 2005]
ต่อมา สร้าง Data Access ให้กับข้อมูลข้างต้นนะครับ
– สร้าง class ไว้เก็บค่าจากตาราง ให้ชื่อว่า HierarchyNode
– List ของ HierarchyNode เป็น class ชื่อ HierarchyNodes [สังเกตว่าเติม s นะครับ ]
*จาก code ตัวอย่างอาจจะดู รวบรัด มือใหม่อาจจะงง ก็แยก class HierarchyNode ออกจาก HierachyNodes ก็ได้ครับแล้วค่อย ทำเป็น List ทีหลัง ให้เป็น file ชื่อ HierarchyNode.cs
หลังจากนั้น แล้วทำ Data Access Class เพื่ออ่านค่าจาก ตาราง tblHierarchyTree ตาม code ด้านล่างนะครับ
ผมให้ class ชื่อว่า HierarchyNodeADO นะครับ เต็ม ๆ จะได้ดังนี้นะครับ ไฟล์ชื่อ HierarchyNodeADO.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace wHierarchyApp.DAO { public class HierarchyNodeADO { string connetion = @"Server=.\SQLEXPRESS; User Id=sa;Password=pongratee;Database=test" ; public HierachyNodes getAllNODE2() { string sqlstr = "Select * from tblHierarchyTree order by NODE_ID"; HierachyNodes result = new HierachyNodes(); using (SqlConnection con = new SqlConnection(connetion)) { con.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = con; cmd.CommandText = sqlstr; SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { result.Add(new HierachyNodes.HierarchyNode() { NODE_ID = int.Parse(reader["NODE_ID"].ToString()), NODE_DESCRIPTION = reader["NODE_DESCRIPTION"].ToString(), NODE_PARENT_ID = int.Parse(reader["NODE_PARENT_ID"].ToString()) }); } } return result; } } }
หลังจากนั้นเราก็ เปิด Form1.cs หรือ สร้างในชื่อใด ๆ ก็ได้นะครับแล้ว ก็ วาง Treeview contrl และ button ลงไปครับ
Treeview สำหรับการแสดงผล ส่วน Button สำหรับการ สั่งให้ดึงค่าจาก ตารางมาแสดงผลนะครับ ดู code ด้านล่างเป็นส่วนที่ สำคัญสำหรับการแสดงผลนะครับ ลองดู logic ของ code และทำความเข้าใจดูนะครับ ตรงไปตรงมาไม่ยากนะครับ ผมละส่วนอื่น ไว้ในฐานที่เข้าใจนะครับ code ส่วนนี้จะเป็นส่วนที่ ดังข้อมูลจาก DataBase มาแสดงผลผ่าน HierarchyNodeADO class [Data access class]
s_teerapong2000@yahoo.com
How to embed a form in a control – จับ from มาใส่ form
it’s another time there is some asking about how to show form into another form. i have been trying to find around the web to get the example . but i found the answer myself as following example. . . [try to understand my bad English] . ha ha
in this posting i will show how to put existing two form into one main form , by the way i’m doing this in main form i put the tab with two tab pages , first tabpage for first form and anther tab put second form. as following picture.
figure 1. show two tab in main form
By doing this i create the project with main form name form1.cs and another two is anotherform.cs and moreform.cs
First – put two tab into mainform (form1.cs) and place panel1 into tabpage1 and groupbox1 into tabpage2 [please note this the control must be a container control]
then – Create another two form , anotherform.cs and moreform.cs
anotherform.cs
in this form show information of two textbox when you click ‘show information’ button
moreform.cs
in this form the textbox will show the selected text of above combobox…
I will not go in detail of how these two form work i will explain how it work in the main form.
in main form (form1.cs) , see the following code, better then explain…
public void ShowFormInControl(Control myctl, Form myfrm) { myfrm.TopLevel = false; myfrm.FormBorderStyle = FormBorderStyle.None; myfrm.Dock = DockStyle.Fill; myfrm.Visible = true; myctl.Controls.Add(myfrm); } private void button1_Click(object sender, EventArgs e) { anotherForm myform = new anotherForm(); ShowFormInControl(panel1, myform); moreForm myform2 = new moreForm(); ShowFormInControl(groupBox1, myform2); }
in the source code you can see the technique of how to put the form into control in the “ShowformInControl(Control myctl, Form myfrm) ” the function perform putting the form ( myfrm ) into Control( myctl ) as i mention earlier – the control must be container control. without any explanation it’s obviously show in the code…
then the forms are load by the click event of button1. – create form and put into control by calling ShowformInControl where ever you want to put , panel or groupbox or any contrainer control.
hope this will help … s_teerapong2000@yahoo.com
you can download code example here frmAdvance.zip
การทำ Master-Detail โดยใช้ BindingSource,Master-Detail using BindingSource
ในการสร้าง Database Application นั่นในบางครั้งเราอาจจะต้องการ การแสดงผลในลักษณะที่เป็น Master-Detail คือมีตารางหลักและตารางที่แสดงผล Detail อีกหนึ่งตาราง เมื่อคลิกที่ record ใด record หนึ่งในตารางหลัก ก็จะนำไปสู่การแสดงผลที่ตารง Detail ที่สัมพันธ์กับข้อมูลในตารางหลัก ซึ่งการทำในลักษณะนี้เราเรียกกันว่า Master-Detail นะครับ ส่วนวิธีการนั้นก็มีวิธีการทำได้หลากหลายนะครับตั้งแต่ แบบลูกทุ่ง ไปจนถึง Best Practices ในบทความนี่เราจะหล่าวถึงวิธีที่การทำโดยใช้ component ที่ชื่อว่า BindingSource ถ้าใครเป็นแฟนของ ADO.NET ก็คงพอจะรู้ว่า มันเป็น component ที่เริ่มมีใช้ใน version 2.0 นะครับ ถ้าผมไม่เลอะเลือน ซึ่งวิธีการนี้จะทำให้ programmer ลดงานต่าง ๆ ลงมากและ ลดข้อผิดพลาดลงได้มากนะครับ ไม่ต้องเสียเวลาไปพะวงกับการ ตรวจสอบมากจนเกินไป
สำหรับการทำงานผมจะกล่าวถึง concept ในการทำก่อน นะครับ ตัวอย่างของแนวคิดนี้ก็เช่น เรามีตาราง Orders และ OrderDetails โดยทั้งสองตารางนี้เราอ้างอิงกันโดยใช้ OrderID นะครับ ดังรูป
แล้วใน windows Form นั้นเราต้องการแสดงผลดังนี้
นั่นก็คือเราใช้ DataGridView กับทั้งสอง table แล้ว Binding ด้วย BindingSource ให้กับทั้งสอง table ซึ่งเดี๋ยวเราจะมาดูกันว่าเราจะ Binding อย่างไร และเราก็จะต้อง สร้าง Relation ของทั้งสองตารางนี้ ใน DataSet ที่เรา Fill ทั้งสองตารางนี้ลงไปด้วย คือเราจะทำการ Fill ทั้งสอง Table ลงใน Dataset เดียวกันแล้วก็สร้าง Relation ระหว่างทั้งสอง Tables นี้แล้วจึง ทำการ Binding ให้กับ DataGridView นะครับ นั่นคือ Concept ทั้งหมดในการทำ ต่อไปเรามาดูขั้นตอนวิธีการทำเลยดีกว่านะครับ
สมมุติว่าเราได้สร้าง windows Form แล้วและเราได้ นำเอา DataGridView มาวางใน Form แล้วตั้งชื่อให้ว่าเป็น dgvOrders และ dgvOrderDetails นะครับ อีกนิดหนึ่งนะครับ ฐานข้อมูลถ้าเราใช้ Microsoft Access เราต้อง using System.Data.OleDb หรือ ถ้าเราใช้ Microsoft SQLServer เราต้อง using System.Data.SqlClient นะครับ
- เราก็จะต้องประการตัวแปร object ต่าง ที่เราจะต้องใช้งานเสียก่อนนะครับ เช่น OleDbConnection, OleDbCommand, OleDbDataAdapter, BindingSource
- ต่อไป เราจะทำการ Binding ใน Form1_load นะครับ ในที่นี้ผมจะไม่กล่าวถึง Connection String นะครับ ทุกท่านคงจะรู้แล้วนะครับ เราจะกำหนด Sql String ไว้สองชุดเพื่อการเข้าถึงข้อมูลในแต่ละ Table จะใช้ Sql String อันเดียวก็ได้นะครับ ผมใช้สองชุดก็เพื่อให้การอธิบายมันชัดเจน แล้วเราจะใช้ myCommand กำหนด SelectCommand ให้กับ myDataAdapter และ เราก็จะ Fill ลงใน DataSet ซึ่งเรา จะทำการ Fill ลงไปสองครั้ง ดูตามตัวอยางก็แล้วกันนะครับ private void Form1_Load(object sender, EventArgs e)
{
string ConnectionString = GetConnectionString();
myConnection = new OleDbConnection(ConnectionString);
myConnection.Open();string SqlString1 = “Select * from Orders”;
string SqlString2 = “Select * from OrderDetails”;myCommand = myConnection.CreateCommand();
myCommand.CommandType = CommandType.Text;
myCommand.CommandText = SqlString1;myDataAdapter = new OleDbDataAdapter();
myDataAdapter.SelectCommand = myCommand;myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet, “Orders”);
myCommand.CommandText = SqlString2;
myDataAdapter.Fill(myDataSet, “OrderDetails”);
}
- ครับต่อไปเราจะสร้าง Relation ระหว่าง 2 Tables นี้นะครับ เราจะตั้งชื่อ Relation นี้ว่า เป็น Oreder_OrderDetail นะครับ และเราก็จะใช้ OrderID เป็น ตัวข้อมูลอ้างอิงของทั้งสองตารางดังนี้นะครับดูตามตัวอย่างเลย นะครับ private void Form1_Load(object sender, EventArgs e)
{
.
.
.
myDataAdapter.Fill(myDataSet, “Orders”);myCommand.CommandText = SqlString2
myDataAdapter.Fill(myDataSet, “OrderDetails”);
// —- สร้าง relation —–
DataRelation myDataRelation = new DataRelation(“Order_OrderDetails”,
myDataSet.Tables[“Orders”].Columns[“OrderID”],
myDataSet.Tables[“OrderDetails”].Columns[“OrderID”]);
//————————
orders_BindingSource = new BindingSource();
ordersDetail_BindingSource = new BindingSource();// –กำหนด DataSource ให้กับ Bindingsource
orders_BindingSource.DataSource = myDataSet;
orders_BindingSource.DataMember = “Orders”;ordersDetail_BindingSource.DataSource = orders_BindingSource;
ordersDetail_BindingSource.DataMember = “Order_OrderDetails”;// –Binding ให้กับ Datagridview ทั้งสอง
dgvOrders.DataSource = orders_BindingSource;
dgvOrderDetails.DataSource = ordersDetail_BindingSource;
} - ต่อไปทำ การสร้าง BindingSource และกำหนด DataSource ให้กับ BindingSource ทั้งสองนะครับ และก็ต่อไปเลยก็คือ Binding ให้กับ DataGridView ทั้งสองด้วย ดูต่อจาก code ด้านบนนะครับ…
- ครับ ถ้าดูจากตัวอย่าง code แล้วคงจะพอเข้าใจได้ไม่ยากนะครับ ทั้งหมดนี้ก็เป็นการ ทำการ Binding ในลักษณะ Master-Details ซึ่งผมเคยลองหาใน internet แล้วก็ค่อนข้างที่หายากนิดหนึ่งไม่ค่อยมีใครอธิบายละเอียดละออเป็นภาษาไทยนะครับ ผมก็พยายามอธิบายให้ละเอียดเพื่อเพื่อน โปรแกรมเมอร์คนไทยด้วยกัน ในเรื่องของการ Binding แบบนี้ นะครับ เป็นคุณลักษณะที่ ใช้กับ ADO.NET 2.0 ขึ้นไปนะครับ รู้สึกว่าถ้าต่ำกว่านี้เขาจะไม่มี BindingSource ครับ จริงแล้วการ Binding นั้นยังมีอีกมากนะครับ ในตัวอย่างที่ผมกล่าวมาแล้วนี้เป็นลักษณะ one to many นะครับ ยังมีแบบ many to many อีก ซึ่งคงต้องเอาไว้มีเวลาแล้วจะมาลงไว้ให้นะครับ หรือถ้าใครมีแหล่งข้อมูลก็ช่วย post comment ให้ด้วยนะครับเพื่อ เป็นวิทยาทาน ให้กับเพื่อนโปรแกรมเมอร์ด้วยกัน นะครับ s_teerapong2000@yahoo.com
- สำหรับหนังสือที่เรียกได้ว่าเป็นสุดยอดของเรื่องนี้ก็ต้องเล่มนี้นะครับ “Data Binding with Windows Forms 2.0 – Programming Smart Client Data Applications with .NET” นะครับ
.
.
using System.Data.OleDb;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
OleDbConnection myConnection;
OleDbCommand myCommand;
OleDbDataAdapter myDataAdapter;
BindingSource orders_BindingSource;
BindingSource ordersDetail_BindingSource;
DataSet myDataset;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
.
.
.
}
การทำ Deploy .NET Window application
พอดีจะทำ Setup project กับ โปรเจคเล็ก ๆ ทีทำไว้ ต้องการให้รวมเอา Ms Access ไปด้วยและต้อง รวมเอา Crystal Report Runtime เข้าไปด้วย ยังหาข้อมูลตรงนี้ไม่ได้ ก็เลยตั้งใจว่าคงต้อง ให้เวลากับมันสัีกนิด เพื่อทำความเข้าใจจริงจัง แล้วไหน ๆ ทำแล้วก็ เผยแพร่เพื่อ เพื่อน ๆ โปรแกรมเมอร์ และนักพัฒนาโปรแกรม ด้วยกัน …
ไหน ๆ ก็ พูดแล้วกล่าวถึงคำว่า Deployment กันสักนิด หลังจากที่เราได้พัฒนา Application เส็จสิ้นสมบูรณ์แล้ว ถึงเวลาที่เราจะนำโปรแกรมไปให้กับผู้ใช้งาน หรือสร้างเป็นชุด Installation เพื่อทำให้โปรแกรมของเราสามารถที่ทำงานบนเครื่องผู้ใช้ได้อย่างสมบูรณ์ เราก็ต้องสร้าง ชุด Install ที่สามารถนำไฟล์ทุกไฟล์ที่เกี่ยวข้อง กับการทำงานของโปรแกรม ไม่ว่าจะเป็น .exe , .dll , component ต่าง ๆ ที่เกี่ยวข้อง third party component ไฟล์อื่น ๆ เป็นต้น หรือแม้แต่การสร้าง directory การสร้าง shortcut การทำ environment บนเครื่องเป้าหมาย ให้มีสภาวะเช่นเดียวกับ เครื่องที่เราใช้พัฒนา กระบวนการที่เราทำสิ่งเหล่านี้ก็คือการ Deployment นั่นเอง
วิธีการที่เราจะกล่าวถึง สำหรับการ Deploying .NET Application คือการใช้ Visual studio .NET Deployment Tools ซึ่งใช้เครื่องมือที่มีมาพร้อมกับ .NET Visual studio ในบทความนี้ เราอ้างอิง Visual Studio 2005 นะครับ ซึ่งเจ้าเครื่องมือนี้ เราสามารถใช้สำหรับการทำงานดังต่อไปนี้นะครับ
- ใช้ Copy ไฟล์ที่จำเป็นทั้งหมดไปยังเครื่อง เป้าหมาย
- นอกจากที่มันทำในข้อ 1 แล้วมันก็ยังสามารถเอาไฟล์เหล่านั้นไปไว้ยัง Folders ต่าง ๆ ตามความต้องการของโปรแกรม
- และเรายังสามารถใช้ให้มันสร้าง Registry entry ได้ตามต้องการอีกด้วย
- และยิ่งไปกว่านั้นเราสามรถทำ custom Dialog ได้ และตรวจสอบ ความต้องการเบื่องต้น เช่น ตรวจสอบว่ามี .NET Framework บนเครื่องเป้าหมายหรือไม่ เป็นต้น
- และอื่น ๆ อีก เราสามารถเลือกใช้ได้ตามความต้องการของเรานะครับ
เรามาดูกันที่ เมื่อเริ่มต้นสร้างเราสร้างกัน อย่างไร การเริ่มต้นสร้าง นั้นใช้วิธีการเดียวกับการสร้างโปรเจค นะครับ กล่าวคือเมื่อเราเริ่มสร้างโปรเจค เราเลือก Project type ที่ชื่อว่า Setup Deployment project เราสามารถเลือก template สำหรับการ deployment ได้ตามชนิดของ Application ที่เราทำนะครับ ซึ่งมันก็จะมี
- Setup Project สำหรับการสร้าง Deployment ให้กับ Project ธรรมดาที่ทำงานโดยใช้ windows form
- Web Setup Project สำหรับสร้าง Deployment ให้กับ Project ที่เป็น Web application
- Merge module project สำหรับ การสร้าง Deployment ให้กับ component หมายถึงเราจะ deploy component ที่เราสร้างนะครับไม่ใช่ application
- Cab project ก็เช่นเดียวกัน นะครับสำหรับการ deploying component เช่น component ที่สร้างสำหรับการทำงานบนเครื่อง client เราใช้ component ชนิดนี้วางไว้บน Web server เมื่อ Web browser ต้องการ component การสามารถ download จาก server และทำที่เครื่อง client ได้ คงจะพอนึก app. ประเภทนี้ออกนะครับ
- Web Wizard Project มี Wizard นำทางตลอดทุกขั้นตอนในการทำงาน เหมาะสำหรับ มือใหม่นะครับ จะเริ่มที่นี่
- Smart Device Cab Project สำหรับการ Deploying Application ที่ทำงานกับ Pocket PC หรือ smart Phone
เอาหล่ะครับเข้าประเด็นดีกว่า ความต้องการก็คือ เรา ต้องการ ให้มีการสร้าง path ที่เครื่องปลายทางและ นำเอา file Database ของเรา รวมไปใส่ไว้ที่ path นั้น รวม Crystal report และ .Net framework ด้วย . นั่นคือทั้งหมด ที่ต้องการ
เราเริ่มด้วยการสร้าง Set up Project เราสามารถที่จะสร้างไว้ภายใน Solution เดียวกันก็ได้ หรือ สร้างไว้ต่าง Solution กันก็ได้ (แล้ว add project เข้ามาทีหลัง) ผมขอกล่าวกึงวิธีการ สร้าง ไว้ภายใน Solution เดียวกันก็แล้วกันนะครับ เพราะเวลาเราทำ Installation file ก็มักจะทำ ให้กับ solution ใด solution หนึ่งเท่านั้น
- หลังจากเรา เปิด Solution ขี้นมาแล้ว คือเมื่อเรา เปิดโปรเจคใดโปรเจคหนึ่ง มันก็จะเปิด Solution ที่โปรแจคนั้นอยู่ขึ้นมาทั้งหมด เราก็ Add โปรเจคใหม่เข้าไป โดยเราเลือก ให้เป็น “Setup Project” นะครับ แล้วตั้งชื่อให้กับโปรเจกสักหน่อยก็ได้ ไม่งั้นเราก็จะได้ชื่อ Default ซึ่ง เป็น Setup1 Setup2 .. หรืออะไรก็ตาม
- ถัดมาเราจะได้ view ที่เรียกว่า File system view ซึ่งจะมีรายการของ File system ดังนี้
- Application Folder ซึ่งมันก็คือ “C:/Program Files/ชื่อเรา[manufacturer]/projectductname”
- Profile Folder มันคือ “C:/Program Files” ของเรานั้นเอง
- User’s Desktop คือ path ที่อ้างไปยัง หน้าจอ desktop ของ User แต่ละคนนั่นเอง
- สุดท้าย ก็คือ User’s Program Menu คือ path ที่อ้างไปยัง All programs ใน start นั่นเอง
ที่จริงเราสามารถเพิ่มเข้ามาได้อีก กรณีที่เรามีความต้องการใช้งานมากกว่านี้ คลิกขวาที่ File system on target machine แล้วเลือก Add special folder ผมจะไม่กล่าวถึงในตอนนี้ นะครับเพราะเท่าที่มีนั้นเพียงพอต่อความต้องการของผมแล้ว (ฝรั่งเขาเรียกว่า commonly used ไง ยังไงก็ต้องใช้มัน )
- ขั้นตอนต่อไปคือ การทำ Project output ก็คือว่าจะให้ Project ไหนเป็นตัวโปรแกรมหลักในการ Deploy ครั้งนี้ หรือ main project นั้นแหละครับ เราผมจะให้มันสร้างภายใต้ Application Folder นะครับ ก็คลิกขวาที่ Application Folder แล้วเลือก Add –> Project output นะครับ แล้วจะมีโปรเจค ให้เราเลือก เราก็เลือกว่า โปรเจคใดที่เราต้องการ ดังรูป
เรา Project ใน combobox แล้ว Primary output ที่ Listbox ด้านล่าง นะครับ แล้วก็ OK
- เราจะได้ Primary output ขึ้นทางด้านขวามมือนะครับ หากเราสร้าง class library project ที่เราอ้างอิงจาก primary เราก็จะเห็น .dll ของ class library เหล่านั้นแสดงอยู่ด้วย ดังนี้
จะเห็นว่า ภายใต้ Application Folder ของผมมี Sub folder เพิ่อมเขามาอีก นั้นคือเราเพิ่มเขามา เพื่อให้เป็น sub folder ที่อยู่ภายใต้ folder เดียวกับ .exe file นั่นเอง คือผมต้องการให้มี folder สำหรับ database (ใส่ ฐานข้อมูล MsAccess) และ reports ที่เราเรียกใช้ระหว่างโปรแกรมทำงานนั่นเอง การเพิ่มก็เพียงแค่ คลิดขวาที่ Application folder แล้วเลือก Add->Folder เท่านั่นเอง ครับ
- ส่วนไฟล์ที่ต้องการ add เข้าไปในแต่ละ Folder (database และ reports )นั้นก็ คลิกวาที่ Folder นั้นแล้วเลือก Add->file แล้วเราก็ไปเลือกไฟล์ที่เราต้องการ เช่น filename.mdb เป็นต้น มันก็จะทำการรวม file นั้นเขามาในโปรเจค เช่นเดียวกันกับ reports ซึ่งผมใช้ crystal report ในระหว่างการเขียนโปรแกรมมมันก็จะรวมอยู่กับ code file ผมก็ add มันเขามาใน folder reports ครับ แต่ข้อที่ควรรระวังก็คือ คุณตั้งกลับไปจัดการกับ การอ้างอิง file เหล่านี้อีกครั้ง ให้ตรงกับ ที่ทำไว้ใน setup project และ build ใหม่อีกครั้ง ผมหมายถึงใน primary project นะครับ
- ต่อไปเราจะทำการสร้าง shortcut ที่หน้า desktop และสร้าง item ใน Programe Menu จริงแล้วไม่ใช่เรืองยากเลย ครับ อันดับแรกเราสร้าง short cut ก่อน โดยการคลิกขวาที่ primary output from ……… (active) แล้วก็เลือก “Create shortcut to primary…… ” หลังจากนั้นเราก็จะได้ shortcut มาในชื่อเดียวกันเราก็เปลี่ยนชื่อซะให้เหมาะสม แล้วก็ ดึงไปวางไว้ – หากต้องการให้เป็น shortcut ที่หน้าจอ desktop ก็ วางไว้ที่ User’s Desktop folder ด้านซ้ายมือ
- ในกรณี User’s Program Menu นั้น หากเรามีหลาย Shortcut เราอาจต้องการทำให้เป็นกลุ่มไม่ปะปนกับ menu อื่น ๆ เราก็ต้อง สร้าง folder ภายใต้ User’s Program Menu ด้วย ใช้ชื่ออะไร ก็ตาม หลังจากนั้นเราก็ สร้าง short cut เช่นเดียวกันกับ ที่กล่าวมาก่อนหน้านี้ แล้วก็ลากมาวางไว้ที่ folder ที่อยู่ภายใต้ User’s Program Menu นี้ เราก็จะได้ menu ตามที่เราต้องการ
- นั่นเป็นทั้งหมด ที่ผมทำนะครับ อ้อมีเพิ่มเติมนะครับ เรื่อง Prerequisites … ในกรณีของผมนี่ ต้องการให้ Setup ของผม ตรวจสอบและ install crystal report สำหรับ .net framwork 2.0 ด้วย และ ก็รวมถึง framework ด้วยนะครับ เราก็สามารถที่จะกำหนดได้ดังนี้นะครับ ใน solution explorer ให้คลิกขวาที่ setup project แล้วเลือก properties นะครับจะได้หน้าจอ properties ขึ้นมาเราก็เลือกไปที่ปุ่ม prerequisites นะครับแล้วเราก็เลือก จะเอาอะไรก็ ตามต้องการ
- จากรูปนะครับ เลือกเสร็จด้านล่าง ถัดมาเราก็เลือก Download prerequisties from the same location as my application นะครับ ผมไม่แน่ใจว่า option นี้หมายถึงให้เอาจาก Installation ที่เราทำใช่หรือป่าวนะครับ เพราะผมยังได้ลอง install เครื่องอื่น เลยไม่ clear ตรงนี้ แต่ผมสังเกตุเห็นว่า ภายใต้ Debug จะมี sub folder ของ library เหล่านี้ปรากฎอยู่ อาจจะเป็นแค่ bosttrap โปรแกรมก็ได้ นะครับ คือมันเริ่มต้น และ download ส่วนที่เหลือ จาก internet นะครับ
- ในกรณี prerequisites นี้หลายท่านแนะนำว่า ให้เรา แยกต่างหากไปเลย หมายถึง ถ้าเราต้องการ ให้ผู้ใช้ลง .net framework เราให้ ผู้ใช้ install .net framework ก่อน หรือเราจัดให้พร้อมกับชุด install ก็ได้ เช่นเดียวกันกับ crystal report นะครับ หลายท่านก็บอกให้แยก ประโยชน์ก็คือ มันจะ update ตัวมันเองได้ หากมีการ update เพิ่มเติม เขาว่ามาแบบนั้นนะครับ
- ครับ เพิ่มเติมข้อที่แล้วอีกนิดนะครับ สำหรับใครต้องการ crystal report (runtime) ก็มา ได้ที่นี่นะครับ https://www.sdn.sap.com/irj/boc/businessobjects-downloads แล้วก็ คลิกที่ Get Crystal Reports, Crystal Reports Server, and Xcelsius downloads
- ส่วน .NET Framework คงไม่ต้องบอกนะครับว่า ไป download ได้ที่ไหน
- มาถึงสุดท้าย ท่านก็ build setup Project แล้วก็ลอง install ดูนะครับ แล้วก็ลอง run ดูนะครับ เรื่องการตรวจสอบ เรื่อง .net framework หรือ crystal report นั้นควรจะต้องไปหาเครื่องอื่นลงนะครับ เครื่องที่ยังบริสุทธิอยู่นะครับ ถึงจะรู้ว่า ผิดถูกประการใด ส่วนเรื่อง path ต่าง ๆ นั้นเราตรวจสอบ ได้บนเครื่องเรา แต่ต้องระวังนะครับ บางที่ เราอาจไม่เห็นขอผิดพลาดเพราะว่า บางครั้งถึงแม้เราแก้ไข path อ้างอิง ไม่หมด แล้ว ปรากฏว่าโปรแกรมทำงานได้ ที่ได้ก็เพราะว่า path เดิมของไฟล์ที่เราอ้างอิงนั้นมันยังมีอยู่ มันก็เลยยังทำงานได้ พอไปลงจริงอาจจะเกิดปัญหาได้ ต้องอรบคอบหน่อยนะครับตรงน้
- ก็คงจะจบลงตรงนี้ก่อนะครับ คิดว่าคงพอเป็นแนวทางให้กับหลาย ๆ ท่านได้ นำเอาไปต่อยอดกันเอาเอง นะครับ หากมีอะไรเพิ่มเติมหรือ ท้วงติงก็ comment มา่ได้นะครับ หรือ จะเพิ่มเติมมาก็ได้เพื่อเป็นประโยชน์กับเพื่อน ๆ คนอื่น ต่อไป นะครับ หรือจะ mail มาคุยกันก็ได้นะครับ s_teerapong2000@yahoo.com
The MessageBox Class
เนื่องจาก คราวที่แล้วได้ทิ้งไว้ว่า ในการทำ validation นั้นจะต้องมีการแสดง Message หรือ ข้อความแจ้งต่อผู้ใช้งานถึงข้อผิดพลาด และให้ใส่ข้อมูลให้ถูกต้อง การแสดง Message เหล่านี้มีการแสดง ได้หลายวิธีคือ การใช้ MessageBox Class การใช้ ErrorProvider หรือ การใช้ StatusStrip (status bar) ในบทความนี้เราจะพูดถึงการใช้ MessageBox Class
เรื่องของ MessageBox Class นั้น การใช้งาน ใช้แสดงข้อความโต้ตอบกับผู้ใช้ งานเป็น Windows Message พร้อมทั้งแสดง icon และ ปุ่มที่เราสามารถที่จะกำหนด ได้ตามความต้องการ ในการแสดง MessageBox นั้นเราจะเรียก method ชื่อว่า show()
Show() method นั้นเป็น static method โดยจะรับ arguments 4 ตัวด้วยกันคือ message, title name, buttons, icons การใช้งานก็เป็น ดังตัวอย่าง code นี้นะครับ
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(“The entered data is not valid. Please enter valid data”,
“Data Entry Error”, MessageBoxButton.OK, MessageBoxIcon.Error);
}
จาก code ดังกล่าว จะแสดง MessageBox ดังนี้นะครับ
จาก code ด้านบนเราจะเห็นว่า parameter แรก คือ “The entered data is not valid. Please enter valid data” นั้นแสดงเป็น message ใน MessageBox parameter ตัวที่สอง คือ “Data Entry Error” ก็คือ ส่วนที่เป็น Title ของ MessageBox parameter ตัวที่สาม คือ MessageBoxButton.OK เป็น enum type นะครับ ใช้สำหรับ กำหนดจำนวน และชนิดของปุ่มที่จะใช้แสดง parameter ตัวสุดท้าย MessageBoxIcon.Error ใช้กำหนด รูป Icon ที่แสดง คู่กับ Message ที่เรากำหนด ถึงตรงนี้คงพอจะเข้าใจแล้วนะครับ ว่าจะใช้งานมันได้อย่างไร
ส่วนตารางด้านล่างเป็น รายละเอียด ของ MessageBoxButton และ MessageBoxIcon Enumeration
Option | Description | |
AbortRetryIgnore | แสดง ปุ่ม Abort, Retry, and Ignore | |
OK | แสดง ปุ่ม Ok (default) | |
OKCancel | แสดง ปุ่ม Ok , Cancel | |
RetryCancel | แสดงปุ่ม Retry, Cancel | |
YesNoCancel | แสดงปุ่ม Yes No Cancel | |
YesNo | แสดงปุ่ม Yes, No |
–
Option | Description | |
Asterisk | ![]() |
|
Error | ![]() |
|
Exclamation | ![]() |
|
Hand | ![]() |
|
Information | ![]() |
|
None | ||
Question | ![]() |
|
Stop | ![]() |
|
Warning | ![]() |
ครับ จากข้อมูลที่ ได้กล่าวมานั้นคงจะได้ แนวคิดในการ ใช้งานแล้วนะครับ
มาดูอีกตัวอย่างการใช้งานนะครับ เนื่องจาก MessageBox ไม่ได้ใช้ในการแสดง ข้อความอย่างเดียวนะครับ มันสามารถที่จะตอบรับ การตัดสินใจของ ผู้ใช้งานได้ด้วย นั่นก็คือ DialogResult นั่นเ้องครับ DialogResult เป็น enumeration ที่มีค่าต่าง ๆ ที่ Dialog จะ return หลังจากที่ ผู้ใช้งาน click ปุ่มใด ปุ่มหนึ่ง OK หรือ Cancel ดูจากตัวอย่างก็แล้วกันนะครับ
DialogResult res = MessageBox.Show(“Confirm Delete data.”,
“Deletion confirm”, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (res == DialogResult.OK)
{
// Perform some task
}
จาก code จะเห็น ว่า MessageBox.Show() จะ return ค่าใดค่าหนึ่งออกมาขึ้นอยู่ว่าผู้ใช้จะคลิกปุ่มใด เราใช้ ตัวแปร DialogResult รับค่าแล้วนำไป ตรวจสอบใน if( res == DialogResult.OK ) ว่าผู้ใช้ click ปุ่ม Ok หรือไม่ ถ้าใช้ ก็ทำงานใดงานหนึ่ง ที่เราต้องการ หรือ ถ้าผู้ใช้ click Cancel ก็ผ่านไปเลย ไม่ต้องสนใจ อย่างนี้เป็นตันนะครับ สำหรับ เรื่องของการใช้ MessageBox ก็มีอันจบลง แค่นี้นะครับ