วันจันทร์ที่ 8 กันยายน พ.ศ. 2551

เรียน ASP.net2008

== วันที่ 8 กันยา 2551 เช้า ==
จดคำบรรยาย โดย ฐิติพงศ์ สำราญวานิช

=== Set Property ของ Master Page ===
* ตัวอย่าง การ เซ็ต Propert ของ Master Page
* และ ให้เซ็ตค่า เฉพาะ โหลดครั้งแรก

If Not Me.IsPostBack Then
Me.Title = "Sign Up"
CType(Me.Master.FindControl("lbHeader"), Label).Text = "Sign Up"
End If


=== Me.IsPostBack ===
* และ ให้เซ็ตค่า เฉพาะ โหลดครั้งแร
* ถ้ามี user กดปุ่ม จะไม่ set ค่า , ไม่เข้า If

If Not Me.IsPostBack Then
...
End If


=== Partial ===
แยกแบ่งระหว่าง Designer กับ Source Code จริงๆที่เราเขียน
ที่ GEnerate ไม่ต้องแตะต้อง

=== Namespace ===
เช่น

เป็นกาจัดหมวดหมู่ย่อยๆลงไป เพื่อเรียกใช้ง่าย
Public Partial Class Form1UI
Inherites System.Web.UI.Page


=== Sub , Function ===

เรียกใน VB.NET เรียก Method ,
เป็นคำ ตามแบบ ของ OOP

=== Type Object ===
* เป็น BaseClass ของ OOP
* ทุกๆตัว จะ Inherit มาจาก Object

=== Event Handler ===

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
...
End Sub

จะเห็นว่า Handles Me.Load นั่นคือ ตัวที่ระบุว่า Method นี้ รองรับ Event Load


=== การส่งผ่าน Parameter แบบ Object ของ Object ===

VB.NET เป็น StrongType ต้องระบุ Type
เวลาเรา Inherit จาก Class A ไปเป็น B หรือจาก B ไปเ็ป็น C

ถ้า TypeA Inherit เป็น TypeB
ถ้า TypeB Inherit เป็น TypeC
ถ้า TypeA มี 3 Method , TypeB มี 7 Method
ถ้า Dim a As TypeA แล้ว a จะเก็บ Object ของ TypeB , TypeC ได้
เช่น Dim b As TypeB
a = b ได้ ( แต่ b = a ไม่ได้ )
เป็นเรื่องของ Polymorphism

ข้อมูลนั้นจริงๆ จะเป็น Object TypeB ที่มี 7 Method
แต่ Interface ภายนอกจะเป็น เห็นแค่ Method ของ TypeA คือเห็นแค่ 3 Method
ไม่สามารถ มองเห็น Method ที่เพิ่มมาของ TypeB ได้

ใช้ a.MethodOfTypeB ไม่ได้
แต่ใช้
a.MethodOfTypeA ได้

การแปลงกลับไปเป็น TypeB ทำโดย
Dim bx As TypeB
bx = CType(a,TypeB) แปลงกลับ ทำให้ bx มี 7 Method เหมือนเดิม ได้
แล้วจะใช้ bx.MethodOfTypeB ได้

เป็นการเปลี่ยน Interface หรือเหมือนกับ เปลี่ยนกรอบ

ถ้า Object จริงๆเป็น a แล้วจะเปลี่ยนเป็น เป็น B อย่างนี้ไม่ได้




=== สิ่งที่ FindControl Method Return ค่ามา มี Typeเป็น อะไร ===

ทุก Web Control จะ Inherit มาจาก Class เดียวกัน ชื่อว่า
System.Web.UI.Control
แต่การจะ Cast เป็น อะไรต้อง รู้ Typeจริงๆของมัน

เช่น Object เป็น label และ Cast เป็น TextBox จะ Error ขณะรันทาม

NOTE : น่าจะเรียกว่า Late-Binding


=== Sender Parameter ===

* Sender As Object

เราต้องรู้ เองว่า Sender มี Type เป็นอะไร
เพื่อจะ Casting เพื่อเปลี่ยน เพื่อให้เห็น Method มากขึ้น

=== Type Casting ===

ใน OOP การเีปลี่ยน Type เรียกว่า Type Casting ปกติไม่เรียก Convert
แต่ .NET ใช้ คำว่า Convert

เรามักใช้ Casting เยอะ



=== Page Load , Master , Content ===
* Page Load จะทำทั้งคู่
* หน้า Content จะทำก่อน Master จะทำทีหลัง
* ทดลองโดยใช้ Page Break ใน Debug
* ดังนั้นหากต้องการ ให้ทุก หน้าแสดง ชื่อ Application เหมือนกัน จึงทำโดย ใส่โค้ด ดังนี้ ใน Page_Load ของ Master Page


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Page.Title = "ระบบงาน ABC :" & Page.Title
End Sub

== วันที่ 8 กันยา 2551 บ่าย ==

=== Web Server Control ===
ควรใช้ Web Server Control
เท่าที่จะทำได้ เพื่อให้ง่าย แทนการใช้ HTML ธรรมดา
เพราะจะควบคุมได้ง่ายกว่า และ แก้ไขง่ายกว่า

==== TextBox ====
===== view state =====
เ ซ็ตที่ Page Property ถ้า กำหนด
View State == false
จะทำให้ไม่มีการจำค่าระหว่างหน้า เช่้นเมื่อมีการกดปุ่ม button เพื่อประมวลผล

* ต้องลองที่ TextBox จะเห็นชัด
* True : เมื่อ PostBack แล้วจะไม่เปลี่ยน
* False : PostBack แล้วหาย
* ลองที่หน้าจอ แล้ว ไม่็เป็น ผล ต้อง ลองทดสอบเอง อีกที กับ TextBox

===== id =====
ทุกคอนโทรลต้องมี id

===== CSS Class =====
คือ คลาสของ Style Sheet

===== Behavior , Auto Complete Type=====
* มีเพิ่มใหม่ ใน VS2008 มี Intellisense
* แต่ มักเป็น Pattern ของ US จึงไม่มีประโยชน์เท่าไร

===== AutoPostBack Property =====
* เช่นปุ่ม กด เกิด Event
* หลัง เกิด Event มี 2 ลักษณะ คือ 1 เกิดที่ client แล้วจะไปเกิดที่ server
* ปกติ จะ PostBack ที่ Button เท่านั้น Control อื่นเช่น TextBox จะไม่ มีผลให้ PostBack
* Dropdown ListBox Property AutoPostBack ถ้ากำหนดเป็น True จะทำให้ เมื่อแก้ไขข้อมูล แล้วจะส่ง PostBack ทันที

===== Enable =====
* กำหนด ให้ False -- ดูอย่างเดียว

===== MaxLength =====


===== Rows / TextMode =====
สำหรับ TextBox ว่าบรรทัดเดียว หลายบรรทัด หรือ password

===== ToolTips =====
เมื่อเมาส์ผ่าน

===== Wrap =====
กรณี TextArea ให้ตัดข้อความเมื่อ เป็น TextArea

===== Event สำคัญ TextChanged =====
มี เพียง Event เดียว

==== Command ====
* มี 2 event สำคัญ
* Click
* Command , กับ Key

==== HyperLink กับ LinkButton ====
* กด แล้ว PostBack ---> Link Button
* กดแล้ว ไม่เกิด Event แล้ว วิ่้งไป เว็ปอื่นเลย --> Hyper Link , ไม่มี PostBack

===== HyperLink Property ที่ใช้บ่อย =====
* NavigateURL : ให้วิ่งไปหน้าไหน
* Target : ปกติ หน้าเดิม ,Blank เพื่อให้เปิดหน้าใหม่

==== Image Button ====
เหมือน LinkButton เพียงแต่ กำหนดรูปได้
ว่าจะเอารูปไหนเป็นปุ่ม

==== DropDown List ====
บางคนเรียก ComboBox

==== List Box ====
==== CheckBox ====

==== RadioBox ====

==== CheckBox List /RadioButton List ====
* รายการที่เลือกดึงจาก Db ได้ ง่ายมาก
* ใส่เป็น Item ได้ด้วย

==== Control อื่นๆ ====
* Control อื่นๆ ไม่ค่อยได้ใช้
* แต่ที่สำคัญ คือ Literal , FileUpload , ...

=== ทดลองทำ ===

* ทดลองสร้าง Page SignUp เพื่อลงทะเบีัยน ใช้ control TextBox,RadioButton , DropDownListbox
* ให้ใช้ Standard Control ไม่ใช่ HTML Control
* แต่ Table ให้ใช้ HTML Control
* Password ให้ใช้ TextBox , Property TextMode=Password


=== Dropdown List , Property ===
* Index เป็นตัวเลข ตั้งแต่ 0
* Item -- Return มาเ ป็น Object ของ ListItem
* ใน ListItem จะบอกหมด ตั้งแต่ index, text ,value
* SelectedValue -- เป็น String , ไม่ใช่ที่แสดงอยู่แต่เป็น ที่ Value ที่ำ กำหนดใช้จริงเช่น รหัส
* การเลือก รายการแ รก ใ ช้ SelectedIndex = 0
* การเคลียร์ค่า จะใช้ SelectedIndex = -1 แต่ถ้า เป็น dropdown listbox จะยังคงแสดงค่าแรก

=== RadioButton List ===
* การกำหนดใ ห้เ ลือ ก รายการ แ รกจะใ ช้ SelectedIndex = 0
* การเคลียร์ค่า จะใช้ SelectedIndex = -1

=== Form Validation ===
* ปกติ ต้องเขียนโปรแกรมเช็ค แต่คอนโทรลนี้ ช่วยไม่ต้องเขียนโปรแกรม
* เช่นตรวจสอบ e-mail
* เรียก validation server control
* มี อยู่ 6 ตัว ใน VS.NET 2008
* หลักๆ : Require , Compare เช่น 2 ช่องต้องตรงกัน , Type ข้อมูล ตัวเลขตัวหนังสือ ,Format เช่น Email
* การทำ Validation ควรทำ ที่ Client ไม่่ใช่ server
* เดิมใช้ 2 แบบ คือ 1 ส่ง server ตรวจ 2 ใช้ javascript
* web server control -- generate javascript ให้เหมือนๆเดิม
==== Require Field ====
* เช็คว่าตัวไหน Require ไม่ Require
* สิ่งที่ต้อง set : ControlToValidate เช่นเลือก txEmail
* การเตือนมี 2 ลักษณะ คือ 1 จุดที่วาง 2 แสดงที่ '''Validation Summary''' Control
* ปกติ แล้ว [[#Validation Summary | Validation Summary]] นั้น 1 Page ใช้แค่ 1 Control , มักวางด้้านล่าง

==== Validation Summary ====
* เลือก Display Mode ได้หลายแบบ เช่น เป็น Bullet , ห รือจะ ให้ แสดงเป็น messagebox popup ก็ได้
* ลำดับ การแสดง Error จะควบคุมไม่ได้
* ไม่ต้อง set อะไร เพิ่ม มันจะเอา Error Message จาก Control อื่นมาแสดงเลย
* ถ้าไม่ต้องการ ให้ Validator Control อื่นๆ แสดง Message ก็ให้ Set Propery '''Display''' ของ Validator Control นั้น ให้เป็ น '''none''' แทน '''Static'''

==== Range Validator ====
* ตรวจสอบประเภทก่อน , เลือก Type ก่อน เช่น Integer
* แล้วเลือกช่วง Minimum , Maximum
* อื่นๆ เหมือนกันกับ Require

==== RegularExpression Validator ====
* ใช้ Regular Expression
* เช่นใช้กับ e-mail , มี รูปแบบให้เลือกแล้ว
* ถ้าต้องการ ใช้กับ เลขประจำตัวประชาชน ถ้า ต้องการให้มีขีด หรือ เบอร์มือถือ ก็ช่วยให้ตรวจสอบได้ง่าย
* Regular Expression จะมีการใช้งาน ใน วิชาเรียน compiler , เหมืิอนๆ เป็นภาษาๆหนึ่ง
* Set property ''' ValidationExpressio'''n เลือก '''Internet e-mail Address''' จะได้ ดังนี้ \w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

==== Compare Validator ====
* ไว้สำหรับ เปรียบเทียบ ระหว่าง คอนโทรล 2 ตัว
* เช่นใช้เทียบว่า password ตรงกันไหม
* ปกติใช้ Type = String
* Property : ControlToCompare , ControlToValidate

==== Custom Validator ====
* จำเป็นที่จะต้องเขียน Function JavaScript เอาเอง
* แล้ว ใส่ชื่อ Function ลงไป ให้คอนโทรลเรียก function นั้น
* ปกติไม่ค่อยได้ ใช้
* Property : ClientValidationFunction , ControlToValidate

ตัวอย่างการ ใส่ javascript ไว้ใน Page ที่เป็น Master / Content นั้น
โดยทั่วไป ต้อง ใส่ใน Control PlaceHolder อีกที่ แล้วจะวางที่ใน Page ก็ได้

ตัวอย่างเช่น







* แล้วจึง set property '''ClientValidationFunction''' ใ ห้เ ป็น '''test'''

==== การ ยกเลิก Validation สำหรับ บาง control ====
* ปุ่ม Reset ตามปกติแล้วไม่ควรที่จะทำการ Validation
* ต้อง เ็ซ็ต CausesValidation = false เพื่อให้ไม่มีการ เช็ค validate เมื่อ พยายามจะ เคลียร์ฟอร์ม

==== Validation Group Property ====
* ในฟอร์มนี้มี การ validate แค่แบบเดียว แต่บางฟอร์ม มีหลายแบบ
* เช่น มี 2 ปุ่ม ทำงานต่างกัน เช่น ปุ่มค้นหา กับปุ่ม เพิ่มข้อมูล มีการตรวจ control ต่างกัน
* เช่นปุ่มค้่นหา ตรวจ control กลุ่ม แรก ปุ่มเพิ่มข้อมูล ตรวจ control กลุ่มที่2 โดยไม่ต้องตรวจ กลุ่มแรก
* ใส่ชื่อ group ใน property ValidationGroup , เซ็ตทุก Validator ใน Group
* และ ต้อง แยก ValidationSummary ด้วย โดยอาจต้องสร้าง เพิ่ม อีก 1 อัน
* ช่วย ในกรณี ที่ต้องการ ให้ มีการแยก Validate ใน Master/ Content Page

==== การออกแบบฟอร์ม ====
* ให้ออกแบบ เพื่อป้องกัน user กรอกผิดกรอกถูกเสมอ บังคับให้มากที่สุดเท่าที่จะทำได้
==== Cross -Browser ====
* ต้อง Test กับ Browser ที่ต้องการก่อน
* JavaScript ถ้า Browser Disable ไว้ จะทำงานไม่ได้
* ถ้า JavaScript ใช้่ไม่ได้ แต่ กรอก เข้าได้ ทะลุ ในชั้น Database เราต้อง จับ Error มาแสดง ให้ USer เข้าใจด้วย

ทดสอบส่ง Wiki

== วันที่ 8 กันยา 2551 เช้า ==
จดคำบรรยาย โดย ฐิติพงศ์ สำราญวานิช

=== Set Property ของ Master Page ===
* ตัวอย่าง การ เซ็ต Propert ของ Master Page
* และ ให้เซ็ตค่า เฉพาะ โหลดครั้งแรก

If Not Me.IsPostBack Then
Me.Title = "Sign Up"
CType(Me.Master.FindControl("lbHeader"), Label).Text = "Sign Up"
End If


=== Me.IsPostBack ===
* และ ให้เซ็ตค่า เฉพาะ โหลดครั้งแร
* ถ้ามี user กดปุ่ม จะไม่ set ค่า , ไม่เข้า If

If Not Me.IsPostBack Then
...
End If


=== Partial ===
แยกแบ่งระหว่าง Designer กับ Source Code จริงๆที่เราเขียน
ที่ GEnerate ไม่ต้องแตะต้อง

=== Namespace ===
เช่น

เป็นกาจัดหมวดหมู่ย่อยๆลงไป เพื่อเรียกใช้ง่าย
Public Partial Class Form1UI
Inherites System.Web.UI.Page


=== Sub , Function ===
เรียกใน VB.NET เรียก Method

=== Type Object ===
* เป็น BaseClass ของ OOP
* ทุกๆตัว จะ Inherit มาจาก Object

=== Event Handler ===

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
...
End Sub

จะเห็นว่า Handles Me.Load นั่นคือ ตัวที่ระบุว่า Method นี้ รองรับ Event Load


=== การส่งผ่าน Parameter แบบ Object ของ Object ===

VB.NET เป็น StrongType ต้องระบุ Type
เวลาเรา Inherit จาก Class A ไปเป็น B หรือจาก B ไปเ็ป็น C

ถ้า TypeA Inherit เป็น TypeB
ถ้า TypeB Inherit เป็น TypeC
ถ้า TypeA มี 3 Method , TypeB มี 7 Method
ถ้า Dim a As TypeA แล้ว a จะเก็บ Object ของ TypeB , TypeC ได้
เช่น Dim b As TypeB
a = b ได้ ( แต่ b = a ไม่ได้ )
เป็นเรื่องของ Polymorphism

ข้อมูลนั้นจริงๆ จะเป็น Object TypeB ที่มี 7 Method
แต่ Interface ภายนอกจะเป็น เห็นแค่ Method ของ TypeA คือเห็นแค่ 3 Method
ไม่สามารถ มองเห็น Method ที่เพิ่มมาของ TypeB ได้

ใช้ a.MethodOfTypeB ไม่ได้
แต่ใช้
a.MethodOfTypeA ได้

การแปลงกลับไปเป็น TypeB ทำโดย
Dim bx As TypeB
bx = CType(a,TypeB) แปลงกลับ ทำให้ bx มี 7 Method เหมือนเดิม ได้
แล้วจะใช้ bx.MethodOfTypeB ได้

เป็นการเปลี่ยน Interface หรือเหมือนกับ เปลี่ยนกรอบ

ถ้า Object จริงๆเป็น a แล้วจะเปลี่ยนเป็น เป็น B อย่างนี้ไม่ได้




=== สิ่งที่ FindControl Method Return ค่ามา มี Typeเป็น อะไร ===

ทุก Web Control จะ Inherit มาจาก Class เดียวกัน ชื่อว่า
System.Web.UI.Control
แต่การจะ Cast เป็น อะไรต้อง รู้ Typeจริงๆของมัน

เช่น Object เป็น label และ Cast เป็น TextBox จะ Error ขณะรันทาม

NOTE : น่าจะเรียกว่า Late-Binding


=== Sender Parameter ===

* Sender As Object

เราต้องรู้ เองว่า Sender มี Type เป็นอะไร
เพื่อจะ Casting เพื่อเปลี่ยน เพื่อให้เห็น Method มากขึ้น

=== Type Casting ===

ใน OOP การเีปลี่ยน Type เรียกว่า Type Casting ปกติไม่เรียก Convert
แต่ .NET ใช้ คำว่า Convert

เรามักใช้ Casting เยอะ



=== Page Load , Master , Content ===
* Page Load จะทำทั้งคู่
* หน้า Content จะทำก่อน Master จะทำทีหลัง
* ทดลองโดยใช้ Page Break ใน Debug
* ดังนั้นหากต้องการ ให้ทุก หน้าแสดง ชื่อ Application เหมือนกัน จึงทำโดย ใส่โค้ด ดังนี้ ใน Page_Load ของ Master Page


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Page.Title = "ระบบงาน ABC :" & Page.Title
End Sub

test

aaa
bbb
ccc

ddd


for ($i = 0 ; $i <10 ; $++){
echo "$i" ;
}
?>