ข้อมูลใน DropdownList แรกจนถึง DropdownList สุดท้ายกับค่าที่เหลืออยู่ของเขา ด้วย LINQ

ในช่วงที่ผ่านมา ได้มีการพัฒนาระบบโดยมีการนำ LinQ มาใช้นิด ๆ หน่อย ๆ (มือใหม่หัดใช้ >< ) ซึ่งมีอยู่ฟังก์ชันนึงที่เกี่ยวกับ การ Bind ค่า DropdownList กรณีที่มี DropdownList หลาย ๆ ตัวและไม่อยากให้ค่าที่เคยเลือกจาก DropdownList ก่อนหน้าไปแสดงใน DropdownList ถัดไปอีก น่าสนใจทดลองใช้แล้วทำงานได้ดี ผู้เขียนจึงนำมาเขียนเพื่อไว้เตือนความจำ จะได้กลับมาอ่าน แนวคิดและวิธีการดังนี้ค่ะ

ในขั้นตอนแรก สร้าง Data ที่ชื่อว่า MyList เก็บข้อมูล id และชื่อ เพื่อเตรียมเป็น DataSource สำหรับ Bind ให้กับ DropdownList1 ดังนี้

class MyList
{
    private string id = string.empty;
    private string name = string.empty;

    public MyList(string _id, string _name)
    {
        id = _id;
        name = _name;
    }

    public string ID
    {
        get{return id;}
        set {id = value;}
    }

    public string Name
    {
        get{return name;}
        set {name = value;}
    }
}

ต่อมากำหนดค่าให้กับ MyList เพื่อผูกให้กับ DropdownList1

List<MyList> mylist = new List<MyList>{
                    new MyList(1,'name1'),
                    new MyList(2,'name2'),
                    new MyList(3,'name3'),
                    new MyList(5,'name5'),
                    new MyList(10,'name10')
                    };

ผลลัพธ์ของ DropdownList1 ได้ดังนี้

ID          Name
1 name1
2 name2
3 name3
5 name5
10 name10

ต่อมา กำหนดว่า DropdownList1 เลือกค่าเป็น ID = ‘2’

string mySelectedValue = '2';

จากนั้น ที่ Event SelectedIndexChange ของ DropdownList1 ให้ใส่ Code ดังนี้

var myDataSource = from d in MyList
where !mySelectedValue.Contains(d.ID)
select d;

จากนั้นผูก myDataSource ให้กับ DropdownList2 ค่าล่าสุดใน DropdownList2 จะแสดงดังด้านล่าง โดยที่ ID = ‘2’ จะหายไป เนื่องจากถูกเลือกไปแล้ว ดังนี้

ID          Name
1           name1
3           name3
5           name5
10          name10

กรณีที่มี DropdownList3 ก็ให้ทำเหมือนขั้นตอนก่อนหน้า ตัวอย่างกำหนดค่าการเลือกของ DropdownList1 = ‘2’ และ DropdownList2 = ‘5’ ดังนี้

string mySelectedValue = '2,5';

จากนั้น ที่ Event SelectedIndexChange ของ DropdownList2 ให้ใส่ Code แบบเดิม

var myDataSource = from d in MyList
where !mySelectedValue.Contains(d.ID)
select d;

จากนั้นผูก myDataSource ให้กับ DropdownList3 ค่าล่าสุดใน DropdownList3 จะแสดงดังด้านล่าง โดยที่ ID = ‘2’ และ ‘5’ จะหายไป เนื่องจากถูกเลือกไปแล้ว ดังนี้

ID           Name
1            name1
3            name3
10           name10

จะเห็นได้ว่าเราใช้ Query เดียวกันในหลาย ๆ DropdownList ดังนั้นสามารถทำ Query นี้ให้เป็นฟังก์ชันเพื่อเรียกใช้งานได้

หวังว่าจะเป็นประโยชน์ไม่มากก็น้อยสำหรับผู้อ่านนะคะ \(@^0^@)/