Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Kéo thả các item giữa 2 ListBox trong C#?

  1. #1
    Ngày gia nhập
    04 2008
    Bài viết
    14

    Mặc định Kéo thả các item giữa 2 ListBox trong C#?

    Mình có 2 list box. Mình muốn các item trong 2 list box có thể kéo qua kéo lại được. Khi kéo item từ lst1 sang lst2 thì item đó sẽ được add vào lst2 và xóa đi ở lst1. Nếu kéo item vào vị trí của 1 item nào đó thì item đó sẽ bị đẩy xuống và chèn item vừa kéo vào vào vị trí của item vừa bị đẩy. Các bạn gợi ý giúp mình với. Cám ơn nhiều!.

    [Quên mất. Mình mới newbie thui, mong các bạn chỉ dẫn rõ giúp mình nhé.]
    Đã được chỉnh sửa lần cuối bởi The_languages_of_C : 01-04-2008 lúc 07:51 PM. Lý do: quên

  2. #2
    Ngày gia nhập
    10 2007
    Bài viết
    37

    Hỗ trợ Drag and Drop trên ListBox
    Visual C# Code:
    1. //Các thuộc tính cần set
    2. ListBox.AllowDrop = true; //Cho phép Drop vào TextBox này.
    3. ListBox.DrawMode = DrawMode.OwnerDrawFixed; //Dùng để vẽ xem mình drop item tại vị trí nào.
    4. //Các event cần implement
    5. ListBox.MouseDown // Chọn item cần Drag.
    6. ListBox.DragEnter // Chọn hiệu ứng để Drag.
    7. ListBox.DragOver // Khi Drag trên list thì vẽ lại item cho biết drop ở đâu
    8. ListBox.DrawItem // Vẽ lại item.
    Cái này mình chỉ hướng dẫn làm đơn giản kô vẽ lại xác định trước chỗ drop và chỉ trên 1 ListBox (drag & drop giữa 2 cái bạn làm tương tự)
    Visual C# Code:
    1. //...
    2.    listBox.AllowDrop = true;
    3.    listBox.DrawMode  = DrawMode.OwnerDrawFixed;
    4. //...
    5. private void listBox_MouseDown(object sender, MouseEventArgs e)
    6. {
    7.    //Tìm item cần drag
    8.    ListBox lb = (ListBox)sender;
    9.    int index = lb.IndexFromPoint(e.X, e.Y);
    10.    //Điều kiện để drag
    11.    ...
    12.    //Bắt đầu drag item (chỉ cần text. của item đó)
    13.    lb.DoDragDrop(lb.Items[index].ToString() , DragDropEffects.Copy);
    14. }
    15.  
    16. private void listBox_DragEnter(object sender, DragEventArgs e)
    17. {
    18.    //Chọn điều kiện và hiệu ứng của DnD
    19.    ...
    20.    e.Effect = DragDropEffects.Copy;
    21. }
    22. //Khi hoàn tất DnD
    23. private void listBox_DragDrop(object sender, DragEventArgs e)
    24. {
    25.    //Tìm vị trí để drop
    26.    ListBox lb = (ListBox)sender;
    27.    int index = lb.IndexFromPoint(e.X, e.Y);
    28.    //Insert item vào vị trí đó
    29.    //e.Data.GetData(DataFormats.Text): dùng để lấy text của item mình xác định trên event MouseDown
    30.    lb.Items.Insert(index,(e.Data.GetData(DataFormats.Text)));
    31.    //Clear item chỗ mình vừa drag
    32.    ...
    33. }

  3. #3
    Ngày gia nhập
    04 2008
    Bài viết
    14

    Mình chỉnh cái DrawMod thành OwnerDrawFixed là mấy cái item mình add sẵn nó biến đâu hết. Cái listbox thành màu trắng luôn.

    Những event như DragEnter, DragDrop, MouseDown thì mình hiểu rồi.
    Còn cái DrawItem thì mình không biết viết cái event đó như nào bạn ơi.

    Bạn nói rõ hơn giúp mình nhé!.

    Cảm ơn rất nhiều vì đã reply mình .

  4. #4
    Ngày gia nhập
    10 2007
    Bài viết
    37

    Mình chỉnh cái DrawMod thành OwnerDrawFixed là mấy cái item mình add sẵn nó biến đâu hết. Cái listbox thành màu trắng luôn.

    Những event như DragEnter, DragDrop, MouseDown thì mình hiểu rồi.
    Còn cái DrawItem thì mình không biết viết cái event đó như nào bạn ơi.

    Bạn nói rõ hơn giúp mình nhé!.

    Cảm ơn rất nhiều vì đã reply mình .
    ListBox.DrawMode = DrawMode.OwnerDrawFixed;
    Cái này chỉ là option thôi. Đi kèm với cái này cần có event ListBox.DrawItem
    => Bạn cần biết về owner draw

    Hay bạn làm đơn giản như sau:
    Trong event MouseHover:
    - Kiểm tra xem MouseButton1 (Left) có nhấn kô.
    - Nếu có select dòng đó.
    Trong event DragDrop
    - Insert item ngay dòng đc select.

  5. #5
    Ngày gia nhập
    04 2008
    Bài viết
    14

    Dưới đây là đọan code kéo thả item giữa 2 listbox của mình.

    Khi click vào 1 item và giữ luôn chuột kéo thả sang list khác thì không sao. Nhưng nếu chỉ click chuột (rồi nhả chuột) vào item không thôi, thì nó sẽ add ngay 1 khác item giống nó vào listbox. Mình đã viết đoạn code khác để sửa lại. Cụ thể là ở Event DragDrop sẽ chỉ add item khi không có item nào giống nó trong list. Như vậy khi click vào item đó nó sẽ không add item bản sao của nó vào nữa, và khi kéo item đó qua list khác vẫn thực hiện đúng, tức là item đó move qua list kia và xóa đi ở list này.. Một vđ phát sinh là nếu ở cái list mình muốn move qua đã có sẵn 1 item giống item đang move thì item đó cũng sẽ ko move được (lý do tương tự).

    Các bạn có giải pháp nào giúp mình với. Việc kéo thả vào vị trí xác định tạm chưa nói đến. Phần đó bạn ntcuong nói mình ko hiểu lắm


    Visual C# Code:
    1. //Để code vào tag code nâng cao cho dễ nhìn. Đọc Nội quy để biết thêm chi tiết  
    2.  
    3.             this.lstT2.MouseDown += new MouseEventHandler(this.ListBox_MouseDown);
    4.             this.lstT2.DragDrop += new DragEventHandler(this.lstT2_DragDrop);
    5.             this.lstT2.DragEnter += new DragEventHandler(this.ListBox_DragEnter);
    6.  
    7.             this.lstT1.MouseDown += new MouseEventHandler(this.ListBox_MouseDown);
    8.             this.lstT1.DragDrop += new DragEventHandler(this.lstT1_DragDrop);
    9.             this.lstT1.DragEnter += new DragEventHandler(this.ListBox_DragEnter);
    10. /////////////
    11.  
    12.       private void ListBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    13.         {
    14.             ListBox lst = (ListBox)sender;
    15.             for (int i = 0; i < lst.Items.Count; i++)
    16.             {
    17.                 if (lst.GetSelected(i))
    18.                 {
    19.                     lst.DoDragDrop(lst.Text, DragDropEffects.Copy);
    20.                 }
    21.             }
    22.         }
    23.  
    24.         private void ListBox_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
    25.         {
    26.             if (e.Data.GetDataPresent(DataFormats.Text))
    27.             {
    28.                 e.Effect = DragDropEffects.Copy;
    29.             }
    30.             else
    31.             {
    32.                 e.Effect = DragDropEffects.None;
    33.             }
    34.         }
    35.  
    36.  
    37.         private void lstT1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    38.         {
    39.             lstT2.Items.Remove((string)e.Data.GetData(DataFormats.Text));
    40.             lstT1.Items.Add((string)e.Data.GetData(DataFormats.Text));
    41.         }
    42.  
    43.         private void lstT2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    44.         {
    45.             lstT2.Items.Add((string)e.Data.GetData(DataFormats.Text));
    46.             lstT1.Items.Remove((string)e.Data.GetData(DataFormats.Text));
    47.         }
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 02-04-2008 lúc 10:25 PM. Lý do: Cho code vào tag code nâng cao

  6. #6
    Ngày gia nhập
    10 2007
    Bài viết
    37

    Mặc định Kéo thả các item giữa 2 ListBox trong C#?

    Để lấy có 1 dòng đc select mà bạn duyệt hết các item trong ListBox, kô nên làm cách này.
    Visual C# Code:
    1. private void ListBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    2. {
    3.     ListBox lst = (ListBox)sender;
    4.     for (int i = 0; i < lst.Items.Count; i++)
    5.     {
    6.         if (lst.GetSelected(i))
    7.         {
    8.             lst.DoDragDrop(lst.Text, DragDropEffects.Copy);
    9.         }
    10.     }
    11. }
    Bạn phải xác định chỗ nào đc drop, nếu drag bên listbox1 thì listbox2 đc phép drop
    Visual C# Code:
    1. private void listBox_MouseDown(object sender, MouseEventArgs e)
    2. {
    3.    ListBox lb = (ListBox)sender;
    4.    int index = lb.IndexFromPoint(e.X, e.Y);
    5.    //Nếu đã chọn đc item
    6.    if(index != -1)
    7.    {
    8.       //Chọn target
    9.       if(lb.Equals(listBox1))
    10.       {
    11.          //kô cho phép drop ở listbox1
    12.          listBox1.AllowDrop = false;
    13.          listBox2.AllowDrop = true;
    14.       }
    15.       else
    16.       {
    17.          //kô cho phép drop ở listbox2
    18.          listBox1.AllowDrop = true;
    19.          listBox2.AllowDrop = false;
    20.       }
    21.       //Bắt đầu drag item (chỉ cần text. của item đó), dùng DragDropEffects.Move (cái này kô quan trọng)
    22.       DragDropEffects effect = lb.DoDragDrop(lb.Items[index].ToString() , DragDropEffects.Move);
    23.      //Remove item
    24.       if (effect == DragDropEffects.Move)
    25.       {
    26.          lb.Items.RemoveAt(index);
    27.       }
    28.    }
    29. }
    30.  
    31. private void listBox_DragEnter(object sender, DragEventArgs e)
    32. {
    33.    ...
    34.    e.Effect = DragDropEffects.Move;
    35. }
    36.  
    37. private void listBox_DragDrop(object sender, DragEventArgs e)
    38. {
    39.    if(e.Data.GetDataPresent(DataFormats.StringFormat))
    40.    {               
    41.       ListBox lb = (ListBox)sender;    
    42.       lb.Items.Add(e.Data.GetData(DataFormats.Text));          
    43.    }
    44. }

  7. #7
    Ngày gia nhập
    04 2008
    Bài viết
    14

    Tớ làm được rùi. Cảm ơn bạn ntcuong rất nhìu nhé :x .

    Cái event mousedown là lúc mình sửa lại code để nó ko tự copy bản sao của nó đã làm như vậy (và code ở 2 event còn lại cũng khác mình post ở trên đây). Lúc post lên quên sửa lại phần code dư thừa đó..

    Mình sẽ tìm hỉu thêm cái OwnerDraw để kéo thả item linh hoạt hơn.. Nếu không hỉu mình sẽ lại hỏi bạn thêm. Thanks again!.

Các đề tài tương tự

  1. Làm thế nào để thay đổi màu sắc một Item trong ListBox ?
    Gửi bởi caovietthuong trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 12-10-2012, 11:41 PM
  2. [Giúp đỡ] - Làm thế để xóa item đã tồn tại trong Listbox
    Gửi bởi gachoai trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 5
    Bài viết cuối: 02-04-2012, 09:43 PM
  3. Cách tô màu item trong listbox như thế nào ?
    Gửi bởi khacphuctran trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 15-02-2012, 10:36 PM
  4. Set thuộc tính ForeColor của Item trong ListBox như thế nào ?
    Gửi bởi huuhung trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 30-05-2011, 10:43 PM
  5. ADO.NET Xử lý các item trong listbox như thế nào ?
    Gửi bởi tritai3000 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 26-01-2011, 11:24 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn