Thursday, March 10, 2016

C# windows formada sodda Drag & Drop. 1- versiya

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

namespace Library.Controls
{
    public partial class DragDropContainer : UserControl
    {
        public DragDropContainer()
        {
            InitializeComponent();
        }

        public int ColumnCount { get; set; }

        private void DragDropContiner_Load(object sender, EventArgs e)
        {
            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width / ColumnCount,
                    BorderStyle = BorderStyle.FixedSingle,
                    Dock = DockStyle.Left
                };
                Controls.Add(panel);
            }
            SizeChanged += (o, args) =>
            {
                Controls.OfType().ToList().ForEach(x =>
                {
                    x.Width = Width / ColumnCount;
                });
            };
        }
        private bool _mouseDown;
        private Point _point = new Point(0, 0);
        private Control _temp;
        public void Add(Control control)
        {
            var panels = Controls.OfType();
            var minControlsCount = panels.Min(x => x.Controls.Count);
            var dragDropPanel = panels.FirstOrDefault(x => x.Controls.Count == minControlsCount);
            var panel = new Panel
            {
                Size = new Size(dragDropPanel.Width, control.Height + 10),
                Dock = DockStyle.Top
            };
            var header = new Panel
            {
                Dock = DockStyle.Top,
                BackColor = Color.Aqua,
                Height = 10
            };
            dragDropPanel.Controls.Add(panel);
            panel.Controls.Add(header);
            panel.Controls.Add(control);

            control.Dock = DockStyle.Fill;
            control.BringToFront();
            panel.BringToFront();

            header.MouseDown += (sender, args) =>
            {
                if (args.Y > 10) return;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                _temp = panel;
                panel.Dock = DockStyle.None;
            };
            header.MouseUp += (sender, args) =>
            {
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                _temp = null;
                panel.BringToFront();
            };
            header.MouseMove += (sender, args) =>
            {
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex - 1)
                        {
                            dragDropPanel = Controls[panelIndex - 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                            }
                        }
                    }
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = Controls[panelIndex + 1] as DragDropPanel;
                            dragDropPanel.Controls.Add(panel);
                            panel.Location = location;
                        }
                    }
                }
            };
        }
    }
    public class DragDropPanel : Panel
    {
    }
}

No comments:

Post a Comment