Solved

Dual ListBox drag and drop

Posted on 2004-08-31
4
660 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

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

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

Suggested Solutions

Article by: Ivo
C# And Nullable Types Since 2.0 C# has Nullable(T) Generic Structure. The idea behind is to allow value type objects to have null values just like reference types have. This concerns scenarios where not all data sources have values (like a databa…
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

776 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