Most popular

วันอังคารที่ 28 มิถุนายน พ.ศ. 2554

เทคนิคการทำ Drag and Drop (C#)

เทคนิคการ Drag and Drop หรือ "ลากแล้ววาง" ในปัจจุบันนิยมกันมาก และทำให้โปรแกรมมีความเป็น User Friendly มากขึ้น
ผู้เขียนจะอธิบาย Code การทำ Drad and Drop กับ Listbox 2 ตัว คือ LisBox1 กับ ListBox2 ตามรูปด้านล่าง

ในหน้า Design วาง ListBox ทั้ง 2 ตัวไว้คนละข้างของฟอร์ม พร้อมใส่ Item ให้ ListBox1
(ListBox2 ให้กำหนด AllowDrop เป็น true ด้วย)
กำหนด Event MouseDown เพื่อให้ทำงานในขณะที่เกิดการกดเมาส์ลงบน ListBox1


ใส่ Code คำสั่งในส่วนของ Event Mouse Down      

       private void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            //ถ้าใน Listbox1 ไม่มี item อยู่เลยก็ไม่ต้องทำงานคำสั่งด้านล่าง
            if (listBox1.Items.Count == 0) return;


            //หา Index ของ item ใน Listbox1 จากการกดเมาส์
            int index = listBox1.IndexFromPoint(e.X, e.Y);
            //เก็บค่าของ item ในรูปแบบของ string
            string s = listBox1.Items[index].ToString();
            //เรียกใช้ function DoDragDrop พร้อมส่ง parameter 2 ตัว
            DragDropEffects dde1 = DoDragDrop(s,DragDropEffects.All);


            //ตรวจสอบว่า DragDropEffects อยู่ในหมวดใด
            if (dde1 == DragDropEffects.All)
            {
                //หากตรงตามหมวดที่ใช้งาน ให้ลบ item ออกหลังจากที่ลาก item ออกไปแล้ว
                listBox1.Items.RemoveAt(listBox1.IndexFromPoint(e.X, e.Y));
            } 
        }



สถานะต่างๆของ DragDropEffects

  • All : จะสามารถทำ copied , remove ไปจากต้นทาง และให้ย้ายไปที่ปลายทางได้
  • Copy : เป็นการคัดลอกไปที่ปลายทาง
  • Link : ต้นทางเชื่อมโยงกับปลายทาง
  • Move : ย้ายจากต้นทางไปที่ปลายทาง
  • None : ไม่ยอมให้วางที่ปลายทาง
  • Scroll : อยู่ในระหว่างการไปที่ปลายทาง

ส่วนใน ListBox2 จะมีการใช้งานอยู่ 2 Event คือ DragOver และ DragDrop

        //Event Drag Over คือการลากมาถึง

        private void listBox2_DragOver(object sender, DragEventArgs e)
        {
            //ให้กำหนดค่า effect เป็น DragDropEffects All
            e.Effect = DragDropEffects.All;
        }


        //เมื่อวางลงบน ListBox2
        private void listBox2_DragDrop(object sender, DragEventArgs e)
        {
            //ตรวจสอบว่าเป็นค่าที่ถูกลากมาเป็นชนิดตัวอักษร หรือข้อความหรือไม่
            if (e.Data.GetDataPresent(DataFormats.StringFormat))
            {
                //หากเป็นข้อความให้แปลงใส่ในตัวแปร string
                string str = (string)e.Data.GetData(DataFormats.StringFormat);
                //เพิ่ม item ให้กับ ListBox2
                listBox2.Items.Add(str);
            }
        }


เสร็จเรียบร้อย พร้อมทดสอบการทำงานได้ โดยให้กดเมาส์ค้าง ลากข้อความจาก ListBox1 มาจนถึง ListBox2 แล้วปล่อยเมาส์ จะพบว่า item ที่อยู่ใน ListBox1 จะย้ายมาอยู่ใน ListBox2

item จาก Listbox1 จะย้ายมาอยู่ใน ListBox2 ตามภาพ


ที่มา : http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx

1 ความคิดเห็น: