Click here to Skip to main content
Licence CPOL
First Posted 17 Dec 2008
Views 55,094
Downloads 3,323
Bookmarked 89 times

Move controls on a form at runtime

By | 17 Dec 2008 | Article
Move controls on a form at runtime by just using a helper class and one line of code.

Introduction

In some cases, it is handy to move controls on a form around by using your mouse. In this project, there is a helper class which does all the stuff needed to do this. Not only can a control be moved, but also its container.

Only one line of code is used to make a control movable (not ugly drag and drop):

Helper.ControlMover.Init(this.button1);

Really? Yes!!

Background

This code uses anonymous delegates to do the hard work. One advantage of this is that the helper class ControlMover has only static methods.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Helper
{
  class ControlMover
  {
    public enum Direction
    {
      Any,
      Horizontal,
      Vertical
    }

    public static void Init(Control control)
    {
      Init(control, Direction.Any);
    }

    public static void Init(Control control, Direction direction)
    {
      Init(control, control, direction);
    }

    public static void Init(Control control, Control container, Direction direction)
    {
      bool Dragging = false;
      Point DragStart = Point.Empty;
      control.MouseDown += delegate(object sender, MouseEventArgs e)
      {
        Dragging = true;
        DragStart = new Point(e.X, e.Y);
        control.Capture = true;
      };
      control.MouseUp += delegate(object sender, MouseEventArgs e)
      {
        Dragging = false;
        control.Capture = false;
      };
      control.MouseMove += delegate(object sender, MouseEventArgs e)
      {
        if (Dragging)
        {
          if (direction != Direction.Vertical)
            container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
          if (direction != Direction.Horizontal)
            container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
        }
      };
    }
  }
}

Using the Code

An example how to use this code is presented in the project source file. All controls can be moved by a mouse. Also, a simple splitter using a toolbar is presented. Another panel containing a toolbar can be moved by using its toolbar.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace MoveYourControls
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();

      // Make your controls movable by a mouseclick
      Helper.ControlMover.Init(this.button1);
      Helper.ControlMover.Init(this.checkBox1);
      Helper.ControlMover.Init(this.groupBox1);
      Helper.ControlMover.Init(this.textBox1);
      Helper.ControlMover.Init(this.label1);

      // Move a panel by its toolstrip
      Helper.ControlMover.Init(this.toolStrip2, this.panel3, 
                               Helper.ControlMover.Direction.Any);

      // Make a splitter from toolstrip
      Helper.ControlMover.Init(this.toolStrip1, Helper.ControlMover.Direction.Vertical);
      this.toolStrip1.LocationChanged += delegate(object sender, EventArgs e)
      {
        this.panel1.Height = this.toolStrip1.Top;
      };
    }
  }
}

The Form after moving all the controls around.

Points of Interest

Sometimes, a control may only be moved in one direction. This is true for splitters and stuff. The helper class has a direction enumerator which makes things really easy:

Helper.ControlMover.Init(this.button1);
Helper.ControlMover.Init(this.button2, Helper.ControlMover.Direction.Any);
Helper.ControlMover.Init(this.button3, Helper.ControlMover.Direction.Horizontal);
Helper.ControlMover.Init(this.button4, Helper.ControlMover.Direction.Vertical);

Have fun!!

History

As of publication, version 1.0.0.0 is presented.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Alphons van der Heijden

Other

Netherlands Netherlands

Member

I'm Alphons van der Heijden, living in Helmond, Netherlands, Europa, Earth. And currently I'm retiring from hard working, owning my own company. Because I'm full of energy, and a little to young to relax ...., I don't sit down, but create and recreate software solutions, that I like. Reinventing the wheel is my second nature. My interest is in the area of Internet technologies, .NET etc. I was there in 1992 when Mosaic came out, and from that point, my life changed dramatically, and so did the world, in fact. (Y)

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionGreat! PinmemberMember 843059821:26 6 Mar '12  
QuestionGood! PinmemberAlex Park11:01 7 Feb '12  
GeneralMy vote of 5 PinmemberArmando de la Torre13:26 17 Oct '11  
GeneralMy vote of 5 Pinmemberaswind010117:15 16 Jul '11  
Questionplz help to stop a movable control..... Pinmemberkaushik240220:10 5 Jul '11  
AnswerRe: plz help to stop a movable control..... PinmemberAlphons van der Heijden3:50 19 Jul '11  
GeneralThanx PinmemberAlesmol21:02 15 Apr '11  
Generalthnk Pinmembersandeepparekh20:55 9 Mar '11  
GeneralSo thnx very nice work PinmemberIran10:25 1 Sep '10  
GeneralRe: So thnx very nice work PinmemberAlphons van der Heijden12:35 1 Sep '10  
Generalmoving the runtime controls Pinmembersivakumarmr103:45 21 Aug '10  
GeneralRe: moving the runtime controls PinmemberAlphons van der Heijden12:33 1 Sep '10  
GeneralMy vote of 5 PinmemberToli Cuturicu5:01 19 Aug '10  
GeneralRe: My vote of 5 PinmemberAlphons van der Heijden12:35 1 Sep '10  
GeneralMy vote of 5 Pinmemberfishland_ls6:24 20 Jul '10  
Generalneed some help.... PinmemberViper-Eyes4:34 16 Feb '10  
GeneralRe: need some help.... PinmemberAlphons van der Heijden12:02 4 Jun '10  
QuestionUn-initialize the control? Pinmemberkopflos4:59 5 Jul '09  
AnswerRe: Un-initialize the control? PinmemberAlphons van der Heijden23:33 6 Jul '09  
GeneralRe: Un-initialize the control? Pinmemberkopflos9:11 8 Jul '09  
GeneralGreat article....... Pinmembersoumyasurya1:13 19 Mar '09  
QuestionVery very good, but how can i move a control into a contrainer ? Pinmemberfady_sayegh4:30 9 Mar '09  
AnswerRe: Very very good, but how can i move a control into a contrainer ? Pinmemberalphons2:24 14 Mar '09  
QuestionVery impressive, I like it, but what if I want to also resize controls? Pinmemberdubem48:09 4 Jan '09  
AnswerRe: Very impressive, I like it, but what if I want to also resize controls? [modified] Pinmemberalphons21:51 5 Jan '09  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120517.1 | Last Updated 17 Dec 2008
Article Copyright 2008 by Alphons van der Heijden
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid