วันอาทิตย์ที่ 15 มีนาคม พ.ศ. 2552

เทคนิคการควบคุมคอนโทลหลายๆ ตัวในเวลาเดียวกัน

เวลาจะ Disable หรือ Enable คอนโทลในฟอร์ม จะใช้ควบคุมผ่าน Property ที่ชื่อว่า Enable โดยการสั่งงานไปยังคอนโทลแต่ละตัวโดยตรง แต่หากในฟอร์มนั้นมีคอนโทลเยอะๆ การเขียนโปรแกรมเพื่อที่จะปิดเปิดหลายๆ ตัวในเวลาเดียวกันเป็นเรื่องที่ลำบากพอสมควร ยิ่งหากมีการปรับเปลี่ยนคอนโทลภายในฟอร์มในขณะทำงานจริงด้วยแล้วยิ่งปวดหัวใหญ่
เทคนิคง่ายๆ ที่ใช้ควบคุมฟอร์มคือการใช้ Property ที่ชื่อว่า tag ซึ่งอยู่ภายในคอนโทลทุกตัวแล้ว มีขั้นตอนดังนี้

1. กำหนดค่าภายใน tag ที่เราต้องการควบคุม เช่น ใส่คำว่า lock ลงใน Property นั้น
2. ทำการควบคุมคอนโทลโดยใช้เงื่อนไขตรวจสอบว่า tag นั้นเป็น string ที่มีค่าตามที่เรากำหนดไว้รึเปล่า ในที่นี้กำหนดค่าคือ lock โดยใช้ code ควบคุมดังนี้

foreach(Control ctrl in this.Controls)
{
    if((ctrl.Tag as string) == "lock")
    {
        ctrl.Enabled = true;
    }
}


หรืออาจจะเขียนเป็นฟังก์ชั่นไว้ใช้ก็สะดวกดี เช่น

private void disableForm(bool status)
{
    foreach(Control ctrl in this.Controls)
    {
        if(ctrl.Tag as string) == "lock")
        {
            ctrl.Enabled = status;
        }
    }
}

วันจันทร์ที่ 15 ธันวาคม พ.ศ. 2551

การสร้างและใช้งาน Collection.Generic

Generic เป็นเครื่องมือที่ช่วยให้ผู้พัฒนา Collection Class สามารถนำ Class ที่สร้างไว้นำกลับมาใช้งานได้ง่ายขึ้นโดยไม่จำเป็นต้องคำนึงถึงชนิดของตัวแปรที่บรรจุอยู่ใน Collection Class เหล่านั้นในตอนออกแบบ แต่จะทำการกำหนดชนิดของตัวแปรให้กับ Class เมื่อจะนำ Class เหล่านั้นไปใช้งาน

ตัวอย่าง
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication9
{
     // กำหนดตัวแปรเป็นชนิด T ภายใต้เครื่องหมาย "< >"
    public class myCollection<T>
    {
         // นำชนิดตัวแปรนั้นมาใช้งานเช่นเดียวกับชนิดตัวแปรอื่นๆ
        T[] myStack = new T[50];

        public T this[int idx]
        {
            get
            {
                return myStack[idx];
            }
            set
            {
                myStack[idx] = value;
            }
        }

    }

    public class Student
    {
        private String _std;

        public Student(String name)
        {
            _std = name;
        }
        public override string ToString()
        {
            return _std;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // เมื่อนำมาใช้งาน ให้กำหนดชนิดของตัวแปรตามที่ต้องการ ในที่นี้ให้แทนด้วย Class Student ที่ได้กำหนดไว้ (อาจกำหนดเป็น String, Int, ... ก็ได้แล้วแต่จะใช้)
            myCollection<Student>             mCollec = new             myCollection<Student>();

            //หลังจากที่กำหนดเรียบร้อยแล้ว จะสามารถนำตัวแปรนั้นมาใช้งานได้ทันที โดยชนิดของตัวแปรนั้นจะเป็นไปตามที่กำหนดไว้ในขั้นตอนการประการตัวแปร
            mCollec[0] = new Student("Jor");
            mCollec[1] = new Student("Ann");
            mCollec[2] = new Student("Aae");

            for(int item = 0; item < 3; item++)
                Console.WriteLine(mCollec[item]);
            Console.ReadKey();
        }
    }
}