Archive

Author Archive

Delegates and Events ตอนที่ 3

สวัสดีครับ คิดว่าคงมี สักคนที่ได้มีโอกาสอ่าน blog ผม ก็เลยสวัสดีไปงั้นแหละ สำหรับตอนนี้เป็น การพูดถึง delegates ต่อจากตอนที่แล้ว ครับ ซึ่งเราคงจะได้เข้าใจการใช้งาน delegates ไม่มากก็น้อย สำหรับในตอนนี้ จะพูดถึงเรื่อง Multicast delegates ครับ  delegates สามารถที่จะอ้างอิง function หรือ method ได้มาก กว่าหนึ่งนะครับนี่ นั่นก็คือ delegates object หนึ่งตัวสามารถที่จะอ้างอิง ไปยัง หลาย ๆ  method และเมื่อเรียก delegates นั้นก็ทำให้ method ที่มันอ้างอิงอยู่ ทำงานในคราวเดียวกัน ครับ

ครับจากที่ได้กล่าวมา ข้างต้น  delegates นั้นที่จริงแล้วเป็น multicast ก็หมายถึงโดยปกติแล้วมันสามารถที่จะชี้ไปยัง function หรือ method ได้หลาย method หรือ function ในคราวเดียวกัน  Base case ของ multicast delegates ก็คือ System.MulticastDelegate ครับ   ดังนั้น การเรียก delegates object ครั้งเดียวก็สามารถที่จะสั่งให้ หลาย method ทำงานได้ แต่ต้องไม่ลืมนะครับว่า Method เหล่านั้นต้องเป็นไปตามข้อกำหนดของ delegates นะครับ นี้สำคัญ นะครับ 🙂

Delegates and Events ตอนที่ 2

ไม่รู้ว่าจะเรียกตอนที่ 2 ได้หรือป่าว แต่ก็เป็นตอนที่ต่อจาก ตอนที่แล้ว ยังคงเป็นตัวอย่างเพิ่มเติมอีกเพื่อให้มีความเข้าใจมาก มาก และ มากขึ้นอีก เนื่องจาก Concept  ของ delegates นั้นเป็นเรื่องที่สำคัญมาก สำหรับการเขียนโปรแกรมในขั้น Advance ต่อไป จริง ๆ จะบอกให้ อยากให้เพื่อน ๆ หรือน้อง ๆ โปรแกรมเมอร์ ได้เข้าใจ จริง ๆ

เอาละครับเรามาเข้าเรื่องของเราเลยดีกว่า เราจะดูตัวอย่างของ delegates อีก 2 ตัวอย่าง โดยจะพิจารณาการทำงาน ทีละขั้น นะครับ พิจารณา code ต่อไปนี้ เป็นตัวอย่างต่อไป

namespace ConsoleApplication1
{
    public class MyClass
    {
        public delegate void LogHandler(string message);

        public void Process(LogHandler logHandler)
        {
            if (logHandler != null)
            {
                logHandler(“Process() begin”);
            }
            if (logHandler != null)
            {
                logHandler(“Process() end”);
            }
        }
    }
    public class TestApplication
    {
        // Static Function: To which is used in the Delegate. To call the process() function
        static void Logger(string s)
        {
            Console.WriteLine(s);
        }
        static void Main(string[] args)
        {
            // Create an instance of the delegate , pointingto the logging function
            // this delegate will then be passed to the Process() function.
            MyClass myclass = new MyClass();
            MyClass.LogHandler myLogger = new MyClass.LogHandler(Logger);

            myclass.Process(myLogger);
        }
    }
}

จาก Code ข้างต้น หากเรา ทำการ Run ดู ก็จะได้ ผลการทำงาน เป็นอย่างนี้นะครับ

Process() begin
Process() end
ประมาณ นี้ เรามาลองพิจารณา Code กันดูนะครับ ว่า code ข้างต้นทำงานอย่างไร อย่าลืมว่าเรากำลัง ดูตัวอย่างการใช้งาน delegates      ในตัวอย่างนี้ เราจะประกาศ หรือ declare delegates ไว้ใน class ชื่อ MyClass  โดยให้ delegates มีชื่อว่า LogHandler โดยให้มี parameter 1 ตัว เป็น string ใช่ใหมครับ (บรรทัดที่ 5) เมื่อเราประกาศไว้เช่นนี้ นั่นก็หมายถึงว่า Function ที่เราต้องการ ทำ delegate ก็ต้องมี การประกาศในรูปแบบเดียวกัน นะครับ และจากตัวอย่างนี้ แสดงให้เห็น ว่า ตัว function อยู่ที่ไหน ก็ได้ใน namespace เดียวกัน ในตัวอย่างเราวางไว้ใน class TestApplication ซึ่งเป็น class ที่เราใช้เริ่มต้นการทำงาน

ในบรรทัด ที่ 22 – 25 เป็นส่วนที่เรา Implement  function ที่เราต้องการให้เป็น delegates ซึ่งไม่ได้ทำอะไรมากเพียงแต่ นำ parameters ที่ส่งเขามา แสดงผลที่หน้าจอด้วย WriteLine() นะครับ สังเกตุว่า  function นี้ เป็น อะไรครับ ใช้แล้วเป็น static function ด้วย  หลายคนคงพอเข้าใจนะครับ ว่าทำไมต้องทำให้เป็นอย่างนั้น ถามว่า ไม่เป็น static ได้ไหม ตอบว่าได้ แต่ต้องเรียกใช้ผ่าน object ของ TestApplication ใช่ไหมครับ  เพราะมัน เป็น static จึงเรียกใช้มันได้เลย นั่นแหละเป็น เหตุผล ครับ แต่ว่าตรงนี้คงไม่ใช้ประเด็น นะครับ มาดูกัน ครับ

บรรทัดที่ 7 – 18 คือ Function process มี Parameter 1  ตัว เป็นชนิด LogHandler  ซึ่งมันคือ delegates type ที่เราประกาศไว้ เวลาเราใช้งาน delegate เรามองมันคล้าย class หรือ object ก็ได้นะครับ จะไ้ด้สะดวกใจ     นั่นก็คือ function Process(LogHandler logHandler) นั้นรับ parameter เป็น delegate type นั่นเอง  หลังจากนั้น ใน body เป็นการใช้งาน delegates ที่ส่งผ่านเข้าไป ซึ่งการเรียกใช้ ก็เป็นลักษณะนี้

   logHandler("Process() begin");

ก็เป็นการส่ง string ให้กับ function นั่นแหละครับ  มาดูต่อใน Function Main กันนะครับ ที่ function Main นี้เราจะเริ่มใช้งาน ด้วยการ instantiate MyClass หรือ สร้าง object ที่ชื่อ myClass ขึ่นมา  และต่อมาเรา ก็ สร้าง instance ของ delegate โดยเรา ส่งชื่อ function เป็น argument

MyClass.LogHandler myLogger = new MyClass.LogHandler(Logger);

นั่นแหละครับเราก็จะได้ myLogger เป็น object ที่ชี้ไปที่  Logger ครับ เท่านี้เราก็พร้อมที่ส่ง มันไปทำงานที่ไหนก็ได้ตามต้องการ สำหรับตัวอย่างของเรา ส่งกลับไปเป็น Argument ของ  myclass.Process() ดังนี้

myclass.Process(myLogger);

หลังจากนี้ผมคงไม่ต้อง อธิบายต่อนะครับว่ามันเป็นอย่างไรต่อไป

ครับ จากตัวอย่างคงพอจะเห็นการทำงานเพิ่มขึ้นนะครับ ว่า delegate ทำงานอย่างไร  คิดว่าหลายคนยังคงมีคำถามหลาย ๆ คำถามอยู่ในใจ ผมคิดว่าหลาย ๆ คำถามอีกเช่นกัน ท่านสามารถทดลอง หาคำตอบได้ด้วยตนเอง ฮิ ฮิ คือว่าขี้เกียจตั้งคำถามอะครับ

อีกสักตัวอย่างเป็นไงครับ ดูตัวอย่างนี้ดีกว่านะครับ Advance ขึ้นมาอีก

using System.IO;

namespace ConsoleApplication1
{
public class MyClass
{
public delegate void LogHandler(string message);

public void Process(LogHandler logHandler)
{
if (logHandler != null)
{
logHandler(“Process() begin”);
}
if (logHandler != null)
{
logHandler(“Process() end”);
}
}
}
// The FileLogger class merely encapsulates the file I/O
public class FileLogger
{
FileStream fileStream;
StreamWriter streamWriter;

// Constructor
public FileLogger(string filename)
{
fileStream = new FileStream(filename, FileMode.Create);
streamWriter = new StreamWriter(fileStream);
}

// Member Function which is used in the Delegate
public void Logger(string s)
{
streamWriter.WriteLine(s);
}

public void Close()
{
streamWriter.Close();
fileStream.Close();
}
}
public class TestApplication
{
static void Main(string[] args)
{
FileLogger fl = new FileLogger(“process.log”);

MyClass myClass = new MyClass();

// Crate an instance of the delegate, pointing to the Logger()
// function on the fl instance of a FileLogger.
MyClass.LogHandler myLogger = new MyClass.LogHandler(fl.Logger);
myClass.Process(myLogger);
fl.Close();
}
}
}

เอาละครับ หลังจาก ดู code กันแล้วหลายคน คงพอเข้าใจ หลายคนคงถูกใจเพราะตรงกับคำถามในใจจาก ตัวอย่างที่แล้ว ครับในตัวอย่างนี้ เราสร้าง class ใหม่ขึ้นมานะครับ ชื่อว่า FileLogger แล้ว ใน class นี้เราก็มี method สำคัญของเรา คือ Logger เราย้ายมาไว้ใน class นี้เพื่อให้เห็นการทำงานที่แตกต่างออกไปอีก นั้นก็หมายถึงว่า ไม่ว่า function ที่ต้องการใช้เป็น delegate จะอยู่ที่ไหนก็ตาม เราก็สามารถใช้งานมันได้ ครับ ขอเพียงว่าให้เป็นไปตามข้อกำหนดของ การทำ delegates ก็แล้วกัน เอาล่ะครับ ตัวอย่างนี้คงไม่ต้อง พูดกันมากนะครับ เนื่องจากการประกาศ delegates นั้นใช้ของเดิมจากตัวอย่างที่แล้ว แต่ delegate  funciton นั้น อยู่ใน class อีก class หนึ่งและก็ไม่ได้เป็น static method ด้วย ดังนั้นการที่จะเข้าถึง fuction Logger ก็ต้อง ทำผ่าน instance ของ class FileLogger นะครับ ดังนั้นใน Main method จึงได้ instantiate f1 ให้เป็น Object ของ FileLogger ขึ้นมา ซึ่งจะต้องสึ่งชื่อไฟล์ให้กับ Constructor ของ FileLogger ด้วยนะครับ ชื่อ ว่า process.log ตามนี้

FileLogger fl = new FileLogger(“process.log”);

เพื่อให้เราสามารถอ้างอิง เจ้า Logger ได้นั่นเอง หลังจากนั้น เราก็ส่ง  f1.Logger ให้กับ delegates  object ใช่ใหม ครับ แล้วเจ้า instance ของ delegates ก็อ้างอิงมายัง f1.Logger มันก็เหมือนเราเรียกใช้ f1.logger โดยการอ้างอิงผ่านทาง address นั่นเองครับ

MyClass.LogHandler myLogger = new MyClass.LogHandler(fl.Logger);

หลังจากนั้นเราก็ ส่ง  myLogger ให้กับ Process เหมือนเดิมนะครับ แต่ผลการทำงานของ โปรแกรม นี้มันไม่ได้แสดงผลทรี่หน้าจอนะครับ มันส้ราง file และเขียนลง file ลอง พิมพ์ code แล้ว run ดูนะครับ แล้วจะเข้าใจ

จบก่อนนะครับ สำหรับ ตอนต่อไป จะเป็นเรื่อง Multicasting เน่อ   🙂

Categories: C# .NET, DOT NET

Delegates and Events ตอนที่ 1

Class ต่าง ๆ เป็น Reference type  หมายถึง ตัวแปรของ Obeject ของ Class นั้น ไม่ได้อ้างอิงไปยัง Object โดยตรง แต่ชี้ไปยังที่ตำแหน่งใน Address ของ Object แทน ซึ่งทำให้เราสามารถใช้งาน Object ในรูปแบบพิเศษได้มากมาย  Delegates ก็เป็นตัวแปรอีกชนิดหนึ่งที่เป็นลักษณะ Reference type  Deletgates นั้น สามารถที่จะชี้ไปยัง Method หรือ Reference ไปยัง Method ได้ในขณะ runtime  นั่นก็หมายถึงเราสามารถ ที่จะเลือกได้ว่า เราจะ สั่ง Method ไหนทำงานก็ได้ ในขณะ runtime  ขึ้นอยู่กับ ความต้องการในขณะนั้น

ในส่วนนี้ผมจะพูดถึงเรื่อง การสร้าง Deletgates  การทำ multicast delegates และ วิธีการใช้ event กับ delegates

Deletgates เป็นตัวแปร แบบ Reference type สามารถที่จะอ้างอิงไปยัง method ใด ๆ ก็ได้  delegate ใน C# คล้ายกับ function pointer ใน C++   เพื่อให้เกิดความเข้าใจ พิจารณาจาก code ต่อไปนี้

// Delegate declaration
public delegate void MyDelegate(string ArgValue);

public void DelegateFunction(string PassValue)
{
// Method implement here
}
public void UseMethod()
{
// Delegate Instantiation
MyDelegate DelegateObject = new MyDelegate(DelegateFunction);

}

จาก code ด้านบน บรรทัดแรกคือการประกาศ delegate สังเกตุรูปแบบของการประกาศเป็นไปตาม syntax นี้
delegate <return type> <delegate-name> <parameter list>
จาก code ตัวอย่าง delegate ชื่อ MyDelegate ไม่ return ค่าและมี parameter 1 ตัวคือ PassValue ซึ่งมีชนิดเป็น string สำหรับ function ที่เราจะทำ delegate ก็จะต้อง มีการกำหนด signature ให้ตรงกับ delegate ที่ประกาศไว้ จากตัวอย่าง คือ function ถัดมา ชื่อว่า DelegateFunction ซึ่งได้มีการประกาศ signature ไว้ตรงกับ delegate ด้านบนทุกประการ หลังจากนั้น การใช้งานเราจำทำการ instantiate Delegate object คล้ายกับการ Instantiat object ของ Class  เพียงแต่ว่า นี้เป็น object ที่เป็นdelegate โดยจะส่งชื่อ function ที่ต้องการเป็น Parameter ของ delegate constructure

Mydelegate DelegatObject = new MyDelegate(DelegateFunction);

หลังจากนั้น การใช้งานเราสามารถที่จะเรียก DelegateObject แทนชื่อ function ได้เลยและเป็นลักษณะ reference สามารถที่จะส่งผ่าน DelegateObject เป็น argument ของfunctionใด ๆ ที่ต้องการใช้ function เป็น parameter ไ้ด้เลย ซึ่งจะไ้้้่ด้เห็นการใช้งานในรูปแบบต่าง ๆต่อไป

การใช้งาน Delegate

เพื่อให้เห็น ภาพมากขึ้นจะขอยกตัวอย่างการเรียกใช้ function ปกติขึ้นมาพิจารณาเพื่อนำไปสู่การใช้งาน ขอให้พิจารณาจากตัวอย่างนี้นะครับ


namespace MyNameSpace.NoDelegate
{
    public class MyClass
    {
        public void Process()
        {
            Console.WriteLine("Process() begin");
            Console.WriteLine("Process() end");
        }
    }
    public class Test
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            myClass.Process();
        }
    }
}

จาก ตัวอย่าง เป็นการใช้งานทั่วไปสำหรับการเรียกใช้ function สมมุติว่าถ้าหากเราไม่ต้องการเรียกใช้ function ตรง ๆ หล่ะหากเราต้องการที่จะส่งผ่าน function นี้ให้กับ function อื่นเรียกใช้อีกที โดยเฉพาะการทำงานในลักษณะ event-driven เรามาดูการ ใช้ delegate จากตัวอย่างเดียวกัน

Very basic delegate


namespace ConsoleApplication1
{
    public class MyClass
    {
        public delegate void WriteHandler(string message);
        public void Process(WriteHandler writeh)
        {
            writeh("Process() begin");
            writeh("Process() end");
        }
        public void writer(string message)
        {
            Console.WriteLine(message);
        }
    }
    public class Program
    {
        static void Main(string[] args)
        {
            MyClass myclass = new MyClass();
            MyClass.WriteHandler writehander = new MyClass.WriteHandler(myclass.writer);
            myclass.Process(writehander);
        }
    }
}

ผลของการ ทำงาน จะได้เช่นเดียวกับโปรแกรมแรกนะครับ แต่โปรแกรมนี้เราใช้คุณลักษณะของ delegate พิจารณา class Myclass จะเห็นว่ามีการ ประกาศ Delegate  ชื่อ ว่า WriteHandler มี parameter 1 ตัวคือ message และไม่มีการ return ค่าดังนั้น function ที่เราต้องการทำ delegation คือ writer สังเกตุว่า มี signature เหมือนกัน

หลังจากนั้น เราต้องการส่งผ่านฟังก์ชันนี้เขาไปทำงานใน method ชื่อ Process นะครับ สังเกตุว่า Parameter ของ Process นั้นเป็นชนิดเดียวกับ delegate

แล้วสุดท้ายเ้รามาดูที่ class program  ที่ Main เราจะเห็นว่า จะมีการ instantiate delegate object ชื่อ writehander แล้วส่ง method ชื่อ writer เป็น argument ผลก็คือได้ writerhandler ที่อ้างอิงไปยัง writer เราก็โยน writerhandler เข้าไปให้ Process เป็นการส่งผ่าน parameter แบบ reference นะครับ  จะเห็นว่าการทำงานครั้งนี้ เราส่งผ่าน function หรือ method เป็น parameter นะครับ นี่แหละการทำงานของ delegate ครับ จะเห็นว่าการทำงานของ delegate นั้นมีขั้นตอนดังนี้นะครับ

  • Delclaration
  • Instantiation
  • Invocation

จากตัวอย่างที่แล้ว หลายท่านที่เป็น มือใหม่อาจจะยังมึน ๆ ขอตบท้ายด้วย ตัวอย่าง ง่าย ๆ อีกหนึ่งตัวอย่างนะครับ

using System;

namespace Mynamespace.BasicDelegate
{
    // #1 Declaration
    public delegate void SimpleDelegate();

    class TestDelegate
    {
        public static void MyFunc()
        {
            Console.WriteLine("I was called by delegate ...");
        }
        public static void Main()
        {
            // #2 Instantiation
            SimpleDelegate simpleDelegate = new SimpleDelegate(MyFunc);
            // #3 Invocation
            simpleDelegate();
        }
    }
}

เป็นงั้ยครับ พอจะได้ concept ใหม่ครับ ลอง run code ดูนะครับแล้วจะเข้าใจ สำหรับ delegate ขอพอแค่นี้ก่อนนะครับ ขอให้ติดตาม ในตอน ต่อ ๆไปนะครับเนื่องจากมีการใช้งานอีก หลายลักษณะ  ขอให้มีความสุขกับการเรียนรู้นะครับ

Categories: C# .NET Tags:

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 ก็มีอันจบลง แค่นี้นะครับ

Categories: C# .NET, Windows Forms

การทำ Validation

ใน Application การป้อนข้อมูลของผู้ใช้ ควรจะต้อง ถูกต้องและได้ตามรูปแบบที่ต้องการ มิฉะนั้น คงจะต้องเสียเวลากับการแก้ไขอีกภายหลัง  ดังนั้นข้อมูลควรจะต้อง ถูกทำการ ตรวจสอบให้เป็นไปตามรูปแบบ หรือ ข้อกำหนด ที่วางไว้ ในขณะที่ผู้ใช้ ทำการป้อนข้อมูล

ซึงในส่วนนี้เราจะพูดถึงการ ทำการ validation การทำ validation คือการตรวจสอบ ความ ถูกต้องของข้อมูล และการแก้ไขข้อมูลให้ถูกต้อง ข้อมูลในที่นี้คือข้อมูลที่ผู้ใช้ ทำการป้อนให้กับ Application    การทำ Validation สามารถ ตรวจสอบข้อมูลได้หลายลักษณะ เช่น การตรวจสอบรูปแบบ (format) ข้อมูล  การตรวจสอบ ข้อมูลตัวเลข ให้อยู่ในขอบเขตที่ต้องการ และการตรวจสอบความยาวของข้อมูล

ดังนั้น ด้วยการทำ Validation นี้จะทำให้สามารถ แจ้งและจัดการให้ผู้ใช้ ป้อนข้อมูลที่ถูกต้อง เพื่อลด Error ที่จะเิกิดขึ้นภายหลัง

การทำ Validation  User Input

ในการทำ Validate ข้อมูลใน control เราจะทำใน Validating event ของ Control นั้น ๆ     Validating Event จะทำให้ผู้ใช้งาน ไม่สามารถ เลื่อนผ่าน หรือ เปลี่ยน Focus ไปยัง control ถัดไปได้ จนกว่าข้อมูลที่ป้อนนั้นจะเป็นไปตาม ข้อกำหนดที่วางไว้  เช่น Data Entry Form ด้านล่าง ผู้ใช้จะไม่สามารถย้ายจาก Control หนึ่ง ไปอีก Control หนึ่งได้ หาก หรือ จนกว่า ข้อมูลที่ป้อนเป็นไปตามกฏที่วาง ไว้

หาก กำหนดว่า ในช่อง TextBox  Name จะต้องมีข้อมูล อย่างน้อย 1 ตัวอักษร ไม่สามารถปล่อยว่างได้  ในช่อง Age จะต้องกรอกข้อมูล เป็นตัวเลข มากกว่า 35 และสุดท้าย Date of joining จะต้องไม่เกินวันที่ปัจจุบัน  เราสามารถจะทำได้โดย ป้อน Code ลงใน Validating ของ TextBox ดังนี้

// TextBox for Name
private void textBox1_Validating(Object sender, CancelEventArgs e)
{
if(textBox1.Text.Length == 0)
// Prompt the user to enter his name
}
// TextBox for Age
private void textBox2_Validating(Object sender, CancelEventArgs e)
{
if(Convert.ToInt32(textBox2.Text) < 35) // Prompt the user to enter age greater than 35 } // TextBox for Date of join private void textBox3_Validating(Object sender, CancelEventArgs e) { if(Convert.ToDateTime(textBox3.Text) > DateTime.Now)
// Prompt the user to enter date prior to the current date
}

สังเกตุว่า Validating event ต้องการ Argument สองตัวคือ

  • sender อ้างอิง object ที่เป็นเจ้าของ event
  • e ใช้สำหรับการ cancel  validating event

สำหรับ e นั้น จะทำให้ ผู้ใช้ ตรึง focus ไว้ที่ control เดิมตราบเท่า ที่ข้อมูลที่ป้อนจะเป็นไปตาม ข้อกำหนด หรือเป็นไปตามเงื่อนไข การใช้งาน e ตามตัวอย่าง

// TextBox for Name
private void textBox1_Validating(Object sender, CancelEventArgs e)
{
if(textBox1.Text.Length == 0)
{
// Prompt the user to enter his name
MessageBox.Show(“Enter name”, “Error”, MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Cancel = true;
}
}

สำหรับการทำ validate โดย concept ก็เป็น ไปตามที่ได้ อธิบาย ไปแล้ว สำหรับการแสดง ข้อความหรือ Message เพื่อแจ้งหรือโต้ตอบ
กับผู้ใช้นั้น จะกล่าวต่อไป ซึ่งโดยมากที่ใช้งานกันก็คือ MessageBox ErrorProvider control และ StatusStrip control
โปรดติดตามต่อไป สำหรับผู้ที่ติดตามอ่าน Blog นี้นะครับ ผมอ้างอิงกับ Visual Studio 2005 นะครับ