รายละเอียดของการตอบ ::
ก่อนอื่นตัวอย่างที่ให้ไปยังไม่ใช่
มาม่า ครับ
และจากการตรวจสอบการทำงานใน debug (ตอนโพสต์ยัง) ผมขอสรุปแบบห้วนๆ ดังนี้
1.ไม่มี Event ไหนสามารถเข้าถึงการรับค่า Key จาก Edit mode ของ Textbox control ใน Datagridview ได้โดยตรง ยกเว้น embed event หรืออีเวนต์ฝังคอนโทรล ซึ่งจะถูกสร้างขึ้นเป็นแบบ private หรือสามารถใช้ได้เฉพาะภายในคลาสของ Control เท่านั้น
...ควาญจะบังคับช้างต้องขึ้นขี่ช้าง วิธีการคือต้องหาทางเข้าถึง embed event ที่ว่าให้ได้ หรือก็คือ การ
override ฟังก์ชันของ Datagridview ซึ่งหมายความว่าต้องสร้าง User Control ขึ้นมาใช้เองโดยให้สืบทอดจาก Datagridview นั่นเอง ...(แต่จริงๆ อาจมีวิธีเล่นกับ Event แบบรวมมิตรเพื่อเปลี่ยนผลลัพธ์ของคำสั่งเมื่อออกจาก edit mode ได้ ลองเล่นดูครับ...ผมลองมาสามวันแต่ล้มเหลวเพราะกำจัด Infinite Loop ของการรับส่งค่า Key ยังไม่ได้)
2.แบ่งเป็น 2 กรณี คือ ข้อมูลของวันที่ ในฐานข้อมูลถูกเก็บแบบ String กับ DateTime
2.1 ถ้าเป็น String วิธีการส่วนใหญ่คือเล่นกับ String
- ใช้ TextChanged event ป้อน / หลังจากพิมพ์ตัวอักษรที่ 2 และ 5 ในขณะ Input
- เขียนโค้ดเปลี่ยนฟอร์แมตวันที่โดยให้เพิ่ม / ในตำแหน่งที่ 3 และ 6 ใน CellEndEdit Event
2.2 เมื่อไหร่เป็น DateTime การจัดการขั้นต่อไปต้องมีแบบแผนหรืออยู่ในกรอบ
- Crack Event เพราะไม่มี Event ไหนเข้าถึง edit mode ของ Textbox ใน Datagridview ได้โดยตรง และไม่สามารถใช้วิธีใน 2.1 มาแก้ไขได้เพราะติด Pre-validating event ตรวจสอบ datatype ถ้า input มาผิดฟอร์แมตระบบจะแจ้ง error ตรงนี้คือ Event ที่เราจะดึง String ของ DateTime มาแก้ไขก่อนยัดเข้าไปใหม่ โดยขั้นตอนการแตก String ใช้
DateTime.TryParseExact
- ใช้ MaskedTextBox แทน TextBox ใน DataGridView เพื่อหลีกเลี่ยงการตรวจสอบรูปแบบข้อมูลขณะ Input(หรือ edit mode) ...แต่แน่นอนว่าต้องสร้าง User Control ที่สืบทอดจาก DataGridView
...ลองค้นคว้าดูครับ
Quote:การ Format ด้วย DefaultCellStyle จะได้ผลก็ต่อเมื่อมีการกำหนด Type ของข้อมูลใน Database/Datasource ที่สอดคล้องกับคอลัมน์ของ DataGridView แต่รูปแบบที่ผมให้ไปใช้การไม่ได้ ถ้ากำหนด DateTime เป็น "dd/MM/yyyy" ข้อมูลจะถูกแสดงเป็น "dd-MM-yyyy" เพราะ / เป็นอักขระที่ต้องทำ escape string ด้วย ' แบบนี้ "dd'/'MM'/'yyyy" จึงจะแสดงรูปแบบข้อมูลที่ต้องการได้ถูกต้อง(ไม่เห็นทักเลยครับ)