Friday, March 11, 2016

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

Bu versiyada panellar tartiblandi. Tartib chapdan o`ngga davom etadi.
DragDropContainer ga kiritilgan controllar qaysi o`rinda turgani ham ko`rish mumkin.


Keyingi versiyada har bir harakatni, biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolamiz va unga Action bajartiramiz. So`ng bu DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ladi.

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

namespace ControlsLibrary.Controls
{
    public class DragDropContainer : Control
    {
        private bool _mouseDown;
        private Point _point = new Point(0, 0);
        public int ColumnCount { get; set; }
        public IEnumerable> Child => Controls.OfType().Select(x => x.Child);

        protected override void InitLayout()
        {
            base.InitLayout();

            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width / ColumnCount,
                    BorderStyle = BorderStyle.FixedSingle,
                    Dock = DockStyle.Right
                };
                Controls.Add(panel);
            }
            SizeChanged +=
                (o, args) =>
                {
                    Controls.OfType().ToList().ForEach(x => { x.Width = Width / ColumnCount; });
                };
        }

        public void Add(Control control, int? position = null)
        {
            var panels = Controls.OfType().ToArray();
            var dragDropPanel = position.HasValue
                ? panels[position.Value]
                : panels.FirstOrDefault(x => x.Controls.Count == panels.Min(t => t.Controls.Count));

            dragDropPanel?.AddControl(control, (sender, args) =>
            {//mouseDown
                var panel = control.Parent;
                if (args.Y > 10) return;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                panel.Dock = DockStyle.None;
            }, (sender, args) =>
            {//mouseUp
                var panel = control.Parent;
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                panel.BringToFront();
            }, (sender, args) =>
            {//mouseMove
                var panel = control.Parent;
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);

                    // next dragdroppanel
                    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;
                            }
                        }
                    }
                    // previous dragdroppanel
                    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 && panelIndex > 0)
                        {
                            dragDropPanel = Controls[panelIndex - 1] as DragDropPanel;
                            dragDropPanel?.Controls.Add(panel);
                            panel.Location = location;
                        }
                    }
                }
            });
        }
    }

    public class DragDropPanel : Panel
    {
        public LinkedList Child { get; } = new LinkedList();

        public void AddControl(Control control,
            MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
        {
            var panel = new Panel
            {
                Size = new Size(Width, control.Height + 10),
                Dock = DockStyle.Top
            };
            var header = new Panel
            {
                Dock = DockStyle.Top,
                BackColor = Color.Aqua,
                Height = 10
            };
            Controls.Add(panel);
            panel.Controls.Add(header);
            panel.Controls.Add(control);

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

            header.MouseDown += mouseDown;
            header.MouseUp += mouseUp;
            header.MouseMove += mouseMove;

            Child.AddLast(control);
        }
    }
}


Foydalanish:

void Main(){
              var mainForm = new DragDropContainer
                {
                    Dock = DockStyle.Fill,
                    ColumnCount = 5
                };
                panel.Add(mainForm, "Home");
                mainForm.Add(new Button(),2);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                var items = mainForm.Child;
}

No comments:

Post a Comment