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;
}
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
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
};
}
public void Add(Control control, int? position = null)
{
var panels = Controls.OfType
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
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