Solved

Dual ListBox drag and drop

Posted on 2004-08-31
4
664 Views
Last Modified: 2012-06-21
Greetings,

I am attempting to implement a good old fashioned dual listbox dialog with the button to add one, add all, remove one and remove all. What I would like to implement is drag and drop between the two listboxes (with multiple selections if possible).

Please is there someone out there with an example I would be most grateful.

Thanks in advance.

Bonus points availble for quick and complete response (1000 up for grabs)
0
Comment
Question by:zaroblan
  • 2
4 Comments
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 11943815
simple example ... uses treeviews and a list box.

http://www.c-sharpcorner.com/winforms/DragAndDrop2MG.asp
0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 11944012
also from the windows forms FAQ ..http://www.syncfusion.com/FAQ/WinForms/FAQ_c87c.asp

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace DragDrop
{
      /// <summary>
      /// Summary description for Form1.
      /// </summary>
      public class Form1 : System.Windows.Forms.Form
      {
            private DragDrop.Form1.ListBoxDragNDrop listBox1;
            private DragDrop.Form1.ListBoxDragNDrop listBox2;

            private System.Windows.Forms.Control dropSource = null;
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.Container components = null;

            public Form1()
            {
                  //
                  // Required for Windows Form Designer support
                  //
                  InitializeComponent();

                  //
                  // TODO: Add any constructor code after InitializeComponent call
                  //
            }

            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose( bool disposing )
            {
                  if( disposing )
                  {
                        if (components != null)
                        {
                              components.Dispose();
                        }
                  }
                  base.Dispose( disposing );
            }

            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                  this.listBox1 = new DragDrop.Form1.ListBoxDragNDrop();
                  this.listBox2 = new DragDrop.Form1.ListBoxDragNDrop();
                  this.SuspendLayout();
                  //
                  // listBox1
                  //
                  this.listBox1.AllowDrop = true;
                  this.listBox1.Items.AddRange(new object[] {
                                                                                      "round",
                                                                                      "square",
                                                                                      "thin"});
                  this.listBox1.Location = new System.Drawing.Point(96, 16);
                  this.listBox1.Name = "listBox1";
                  this.listBox1.Size = new System.Drawing.Size(200, 225);
                  this.listBox1.TabIndex = 0;
                        //
                  // listBox2
                  //
                  this.listBox2.AllowDrop = true;
                  this.listBox2.Items.AddRange(new object[] {
                                                                                      "red",
                                                                                      "blue",
                                                                                      "green"});
                  this.listBox2.Location = new System.Drawing.Point(384, 16);
                  this.listBox2.Name = "listBox2";
                  this.listBox2.Size = new System.Drawing.Size(200, 225);
                  this.listBox2.TabIndex = 1;
                  //
                  // Form1
                  //
                  this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
                  this.ClientSize = new System.Drawing.Size(672, 301);
                  this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                                              this.listBox2,
                                                                                                              this.listBox1});
                  this.Name = "Form1";
                  this.Text = "Form1";
                  this.ResumeLayout(false);

            }
            #endregion

            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                  Application.Run(new Form1());
            }

            public class ListBoxDragNDrop : ListBox
            {
                  private int lastMouseUpItemIndex = -1;
                  private bool isDropSource = false;
                  private int lastLine = -1;

                  public ListBoxDragNDrop()
                  {
                        this.AllowDrop = true;
                        this.SelectionMode = SelectionMode.One;
                        DragDrop += new System.Windows.Forms.DragEventHandler(OnDragDrop);
                        DragEnter += new System.Windows.Forms.DragEventHandler(OnDragEnter);
                        DragLeave += new System.EventHandler(OnDragLeave);
                        MouseDown += new System.Windows.Forms.MouseEventHandler(OnMouseDown);
                        DragOver += new System.Windows.Forms.DragEventHandler(OnDragOver);
                        SelectedIndexChanged += new System.EventHandler(OnSelectedIndexChanged);
                  }
                  
                  private void DrawVisualQue(Color color, ref Rectangle rectangle)
                  {
                        Graphics g = Graphics.FromHwnd(this.Handle);
                         g.DrawLine(new Pen(color), rectangle.X, lastLine, rectangle.Width, lastLine);
                   }

                  private void OnDragLeave(object sender, EventArgs e)
                  {
                        if(lastLine > -1)
                        {
                              Rectangle rect = this.GetItemRectangle(0);
                              DrawVisualQue(Color.White, ref rect);
                        }
                  }
                  
                  private void OnDragOver(object sender, DragEventArgs e)
                  {
                        if(e.Effect == DragDropEffects.Copy)
                        {
                              Point point = this.PointToClient(new Point(e.X, e.Y));
                              int index = this.IndexFromPoint(point);
                              bool belowLastItem = false;
                              if(index < 0 || index >= this.Items.Count)
                              {
                                    index = this.Items.Count - 1;
                                    belowLastItem = true;
                              }
                              Rectangle rect = this.GetItemRectangle(index);
                              if(lastLine > -1)
                                    DrawVisualQue(Color.White, ref rect);
                              lastLine = rect.Y + (belowLastItem ? rect.Height : 0);
                              DrawVisualQue(Color.Red, ref rect);
                        }            
                  }
                  
                  private void OnDragDrop(object sender, DragEventArgs e)
                  {
                        if(e.Effect == DragDropEffects.Copy)
                        {
                              Point point = this.PointToClient(new Point(e.X, e.Y));
                              int index = this.IndexFromPoint(point);
                              if( index > -1 && index < this.Items.Count)
                                    Items.Insert(index, e.Data.GetData(DataFormats.Text));
                              else
                                    index = Items.Add(e.Data.GetData(DataFormats.Text));
                              
                              this.SelectedIndex = index;
                        }            
                  }

                  private void OnDragEnter(object sender, System.Windows.Forms.DragEventArgs e)
                  {
                        if (e.Data.GetDataPresent(DataFormats.Text) && !isDropSource )
                              e.Effect = DragDropEffects.Copy;
                        else
                              e.Effect = DragDropEffects.None;

                        lastLine = -1;
                  }

                  private void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
                  {
                        if(MouseButtons == MouseButtons.Left
                              && SelectedIndex == lastMouseUpItemIndex
                              && SelectedItem != null)
                        {
                              isDropSource = true;
                              DoDragDrop(SelectedItem, DragDropEffects.Copy);
                              isDropSource = false;
                              lastMouseUpItemIndex = this.SelectedIndex;
                        }
                  }

                  private void OnSelectedIndexChanged(object sender, System.EventArgs e)
                  {
                        lastMouseUpItemIndex = this.SelectedIndex;
                  }
            }
      }
}
0
 
LVL 19

Accepted Solution

by:
Desp earned 500 total points
ID: 11944031

See the example given in this Article thats shows how to drag n drop between 2 listboxes:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsControlClassDoDragDropTopic.asp
0
 

Author Comment

by:zaroblan
ID: 11950668
I did not expect this to be so complicated.
My users will have to do without drag and drop ... for now :)
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

In order to hide the "ugly" records selectors (triangles) in the rowheaders, here are some suggestions. Microsoft doesn't have a direct method/property to do it. You can only hide the rowheader column. First solution, the easy way The first sol…
Summary: Persistence is the capability of an application to store the state of objects and recover it when necessary. This article compares the two common types of serialization in aspects of data access, readability, and runtime cost. A ready-to…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question