ASP.NET Data Binding ภาคแรก One-way Binding: ตอนที่ 1 ข้อมูลเบื้องหลัง

ในการเขียนโปรแกรมแบบ Data Driven เทคนิคสำคัญที่โปรแกรมเมอร์จะไม่รู้ไม่ได้เลยคือเรื่องของ Data Binding
Data Binding ถ้าแปลตรงตัวก็แปลว่าการผูกข้อมูล ผูกเข้ากับอะไร ผูกเข้ากับ UI Control นั่นเอง
Data Binding ช่วยให้เราไม่จำเป็นต้องมานั่ง assign ค่าจากตัวแปรใส่ UI Control ทีละชิ้นๆ
หรือในทางกลับกันไม่จำเป็นต้องมานั่งอ่านค่าจาก UI Control ใส่ตัวแปรทีละตัวๆ
เราเพียงแค่กำหนดเอาไว้ว่าให้ตัวแปรตัวใด Bind หรือผูกไว้กับ UI ใด
แล้วการเปลี่ยนแปลงใดๆ ก็ตาม ที่เกิดขึ้นทางฝั่งตัวแปร ก็จะไปแสดงผลที่ UI
หรือถ้าเราทำ Two-way Binding การเปลี่ยนแปลงจากฝั่ง UI ก็จะกลับมา update ค่าในตัวแปรด้วยเช่นกัน

ASP.NET ก็ได้รับการพัฒนาให้สามารถที่จะทำ Data Binding ได้เช่นกัน ถึงแม้ว่าจะเป็น Data Binding แบบเทียมๆ เนื่องจากธรรมชาติของ Web App มัน Stateless จึงไม่มี instance ของ control รออยู่ตลอดเวลาเหมือนอย่าง Win App อีกทั้ง interaction ใดๆ ก็ไม่สามารถตอบสนองได้อย่าง Win App ทุกอย่างจะต้องเกิดขึ้นตอน Postback เท่านั้น อย่างไรก็ตาม วิธีการ Binding ของ ASP.NET ก็นับว่าทำได้ดีที่สุดเท่าที่สภาพแวดล้อมจะอำนวยแล้ว และนั่นก็เป็นปรัชญาดั้งเดิมของ ASP.NET ที่พยายามจะทำให้การ develop web app มี model การพัฒนาคล้ายคลึงกับการ develop win app ให้มากที่สุด (ก่อนที่ ASP.NET MVC จะเข้ามารื้อใหม่หมดทุกสิ่ง)

ข้อมูลที่อยู่เบื้องหลัง
เรื่องแรกที่ขอกล่าวถึงสำหรับการ Bind ข้อมูลใน ASP.NET ก็คือ ลักษณะของข้อมูลที่สามารถนำมา Bind ได้ Data-aware Control ใน ASP.NET ได้รับการออกแบบให้ทำงานกับคลาสในเหล่ากอของ Collection และ DataReader กล่าวคือไม่ว่าจะเป็น Array, List, DataSource, DataTable, DataView หรือ DataReader ก็สามารถจับไปผูกกับ Control ได้หมด
มีเรื่องที่ผมอยากจะกล่าวถึงสำหรับพวกคลาสที่จะนำมา Bind ดังนี้

  • Array หรือ Collection ของ Simple object Simple object เช่น Integer, String พวกนี้สามารถ Bind ได้ก็จริง แต่ด้วยความที่ตัว element ของข้อมูลนั้นคือตัว data เองเลย ไม่มีฟิลด์ข้อมูลอยู่ภายใน จึงเหมาะสำหรับนำไป Bind กับคลาสตระกูล ListControl อย่างเช่น DropDownList, RadioButtonList, CheckBoxList เนื่องจากเราสามารถที่นำค่าไปใช้ได้เลย โดยไม่ต้องคำนึงถึงชื่อฟิลด์
  • POCO Collection POCO ย่อมาจาก Plain Old CLR Object หมายถึง object แสนจะธรรมดาๆ ทั่วไป ก็สามารถเอามา Bind ได้ มีกฏอยู่ข้อเดียวเท่านั้นคือสิ่งที่จะนำมา bind ต้องเป็น Property ของ object เท่านั้น เป็น Property เท่านั้นนะครับ ไม่สามารถใช้แค่ Field ของ object ได้ ตัวอย่างเช่น ถ้าเรามีคลาสแบบนี้

    Public Class MyPlainObject
    
        Public Data1 As String
    
        Public Property Data2() As String
            Get
                ' do return value
            End Get
            Set(ByVal value As String)
                ' do set value
            End Set
        End Property
    
    End Class
    

    สิ่งที่สามารถนำไปใช้ Bind ได้มีแค่ Data2 เท่านั้นครับ Data1 ไม่สามารถนำไปใช้ Bind ได้

  • ตระกูล DataTable หรือ DataView คลาสข้อมูลตระกูลนี้มีข้อดีตรงที่มีความยืดหยุ่นสูง เรา “ไม่จำเป็น” ต้องประกาศฟิลด์ให้เป็น Property ไว้ล่วงหน้าก็ได้ ขอแค่ Select ข้อมูลมาใส่ใน DataTable ได้ ก็สามารถอ้างชื่อฟิลด์นั้นๆ ใน Control ที่จะ Bind ได้เลย
    การนำ DataTable มา Bind มีเทคนิคที่อยากกล่าวถึงก็คือ ในกรณีที่เป็น Typed-DataTable เราสามารถที่จะทำ Partial Class สำหรับ DataRow ของ DataTable นั้นๆ แล้วเพิ่ม Property เข้าไปอีกได้ตามต้องการ เสมือนว่าเป็นการเพิ่มฟิลด์ข้อมูลให้แก่ row นั้นๆ และเราก็จะสามารถนำฟิลด์ที่เพิ่มนั้นไปใช้ในการ Bind ได้ด้วยเช่นกัน
    ตัวอย่างเช่น ถ้าเรามี DataTable ชื่อ MyDataTable หน้าตาแบบนี้อยู่

    เราสามารถที่จะเขียน Partial Class MyDataTableRow แล้วเพิ่มฟิลด์ FullName เข้าไปดังนี้ได้

        Partial Class MyDataTableRow
    
            Public ReadOnly Property FullName() As String
                Get
                    Return If(Gender = "M", "นาย", "นางสาว") & FirstName & " " & LastName
                End Get
            End Property
    
        End Class
    

    อันนี้เป็นตัวอย่างง่ายๆ ที่จะแสดงให้เห็นว่า เราสามารถที่จะทำให้ MyDataTable นี้ มีฟิลด์ชื่อ FullName เกิดเพิ่มขึ้นมา และสามารถนำไปใช้ Bind ได้ด้วย ช่วยลดความยุ่งยากในการนำข้อมูลไปแสดงผลในภายหลัง
    อ้อ สังเกตว่าถ้าเราอยากจะให้ฟิลด์ Bind ได้แบบ One-way เท่านั้น หรือ Two-day ได้ด้วย ก็ขึ้นอยู่กับการกำหนด Property ตรงนี้ด้วยครับ ซึ่งในที่นี้ได้ถูกกำหนดเป็น ReadOnly มันจึงสามารถ Bind ได้แค่ทางเดียว (แสดงผลเท่านั้น ไม่มีการ set ค่าคืน)

  • Entity Object Collection ในที่นี้ผมหมายถึง ORM Object ที่เกิดจากการ generate ไม่ว่าจะของ “Linq to SQL” หรือ “Linq to Entity” พวกนี้จะเป็น object ที่มี property ต่างๆ เตรียมไว้เรียบร้อยอยู่แล้ว (ตามโครงสร้างของ Table ใน Database) นอกจาก property ที่แสดงถึงฟิลด์ใน database แล้ว ยังมี property ที่แสดงถึง Relation ใน Database อีกด้วย ซึ่ง ASP.NET นั้นก็ฉลาดพอที่จะอนุญาตให้เราเขียน Expression ในการ Bind ข้อมูล เพื่อที่จะ “ไล่” ไปตาม property เหล่านี้ต่อเนื่องไปจนเจอ property ที่ต้องการได้
    ตัวอย่างเช่น ถ้าเรามี Object Relation หน้าตาประมาณนี้

    แล้วเรากำลัง Bind Object ประเภท Customer อยู่ เราสามารถที่จะเขียน Expression เพื่ออ้างถึงฟิลด์ที่จะ Binding ว่า “Province.province_name” แบบนี้ก็ได้
  • DataReader อย่างสุดท้ายที่จะกล่าวถึงนี้จะแปลกกว่าเพื่อน เนื่องจากมันไม่ใช่ Collection แต่ว่าเป็น DataReader กล่าวคือ ณ เวลาที่ assign data นั้น ยังไม่มีข้อมูลอยู่จริง แต่ขณะที่ Bind ข้อมูลนั้น Data Control จะทำการอ่านข้อมูลจาก Reader ทีละ Record และแสดงผล จนกระทั่งหมด แล้วจึง Close Reader ฟิดล์ที่ได้จาก DataReader นี้จึงค่อนข้างยืดหยุ่น เพราะว่าถูกสร้างมาจาก sql query โดยตรง จึงสามารถจะกำหนดชื่ออย่างไรก็ได้ ไม่จำเป็นต้องมี property หรือกำหนด type ของ object มารับ
    ข้อเสียอย่างเดียวของ DataReader ก็คือ มันเป็นข้อมูลประเภทอ่านได้รอบเดียว เราไม่สามารถที่จะไปล้วงข้อมูลออกจาก Data Control มาเพื่อดูซ้ำได้อีก และผลกระทบที่เห็นได้ชัดก็คือมันไม่สามารถจะทำ Paging ได้

โปรดติดตามตอนต่อไป

3 Responses to “ASP.NET Data Binding ภาคแรก One-way Binding: ตอนที่ 1 ข้อมูลเบื้องหลัง”

  1. Piriya Says:

    เขียนบทความได้ดีมากครับ อ่านแล้วเข้าใจง่าย

  2. amornphun Says:

    บทความ ยอดเยี่ยมมากครับ

  3. Witsanukam Says:

    เขียนบทความได้ดีมาก ภาษาที่ใช้เป็นเอกลักษณ์


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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s

%d bloggers like this: