Nine MVP's Blog

24/01/2007

BLOG : จะหา TextBox หรือ อะไรซักอย่าง ใน Form หรือ Control นี้ ๆ ออกมาทั้งหมด ทำไงดี ??

Filed under: ลากมาตอบ — Nine MVP @ 11:59 pm

เนื่องจาก สืบเนื่องจากหลาย ๆ กระทู้ ถามกันมาจน ๆ  หลาย ๆ กระทู้รวมกัน นับได้หลายสิบเลยทีเดียว

 
จะหา textbox บน form ทำไง?
จะหา control นู๊นน นี้ ทำไง?
 
พี่น้องท่านทั้งหลายก็ บอกกันไป for มั้ง for each มั้ง ล่าสุดผมตอบไป
C# >>  this.Controls.Find("textbox1", true) ;
VB >> Me.Controls.Find("textbox1", true)
 
แต่มันออกมา อันเดียว แถมต้องกำหนดชื่ออีก อืม แบบนี้คงเฉพาะเจาะจงที่อยากจะหาจริง ๆ
บังเอิญอยากได้แต่ TextBox หรือcontrol อะไรซักอย่างนึงทำยังไงดี
อยากได้ method ที่ return ค่ากลับออกเป็น Control ตัวนั้น ๆ และเป็น collection ทำไงดี
จะได้ไม่ต้อง cast ให้เสียเวลา อ้าง property ทำงานต่อได้เลย
 
ก็เลยทำ Class Util ตัวนี้มาให้ใช้กันดู แต่ใช้ได้เฉพาะ .NET 2.0
เป็นการใช้ Generic Programming มา implement ใน method
และท่องไปใน child control ด้วย Recursive method ซึ่งก็เป็นส่วนประกอบของ class นี้
 
 
Code : UIHelper Class
 

/// <summary>

/// version 1.0

/// </summary>

public static class UIHelper

{

    /// <summary>

    /// This method for find a control in control’s collection with Strong Type(Generic).

    /// </summary>

    /// <typeparam name="T">Find Type</typeparam>

    /// <param name="ctrl">ControlCollection</param>

    /// <returns>List of the Generic Type’s Method</returns>

    public static List<T> FindControls<T>(Control.ControlCollection ctrl)

    {

        List<T> list = new List<T>();

        foreach (Control c in ctrl)

        {

            if (c.GetType() == typeof(T))

            {

                T cc = (T)

Convert.ChangeType(c, typeof(T));

                list.Add(cc);

            }

            else

                FindCtrlRecrs(c, ref list);

        }

        return list;

    }
 

    /// <summary>

    /// The Recursive Method for find all a child of controls with Strong Type(Generic).

    /// </summary>

    /// <typeparam name="T">Find Type</typeparam>

    /// <param name="nextControl">root of next control</param>

    /// <param name="list">bag(generic) of found a control</param>

    private static void FindCtrlRecrs<T>(Control nextControl, ref List<T> list)

    {

        if (nextControl.Controls.Count != 0)

        {

            foreach (Control c in nextControl.Controls)

            {

                if (c.GetType() == typeof(T))

                {

                    T cc = (T)

Convert.ChangeType(c, typeof(T));

                    list.Add(cc);

                }

                else if (c.HasChildren)

                    FindCtrlRecrs(c, ref list);

            }

        }

    }

}

 

 
How to use :
 
อยากได้ TextBox จงออกมาก็เรียก

List<TextBox> txts = UIHelper.FindControls<TextBox>(this.Controls);

 

อยากได้ CheckBox ออกมาก็เรียก 

List<CheckBox> txts = UIHelper.FindControls<CheckBox>(this.Controls);

 

 

Create a free website or blog at WordPress.com.