Home > ADO.NET, C# .NET, Windows Forms > การทำ Master-Detail โดยใช้ BindingSource,Master-Detail using BindingSource

การทำ 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 นะครับ ดังรูป

pic2

แล้วใน windows Form นั้นเราต้องการแสดงผลดังนี้

dotnet_databinding_3

นั่นก็คือเราใช้ 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
  • .
    .
    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)
    {

    }
    .
    .
    .
    }

  • ต่อไป เราจะทำการ 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” นะครับ
  1. little
    November 17, 2011 at 10:31 am

    ขอบคุณสำหรับบทความดีๆนะคะ

  2. ่joedaa
    December 4, 2016 at 11:24 pm

    ขอบคุณมากครับนี่แหละที่หามานาน

  1. No trackbacks yet.

Leave a Reply

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 /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: