Windows Formada dizaynda ishlash murakkab. Drag&Drop - dasturga o`zgacha ko`rinish beradi va bu ajoyib imkoniyat ham. Uning tayyor kodini olib ishlatish esa undanda ko`proq zavq-shavq beradi :-)
Oldingi versiyada aytilganidek biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolinadi va unga Action bajartiriladi. DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ldi.
Shuningdek har bir panel tepasiga sarlavha ko`rinishida soha nomini yozib qo`yish mumkin, hamda sohalarga border rangini ham tanlash mumkin bo`ldi.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
namespace Library.Controls
{
public class DragDropContainer : Control
{
private readonly Panel _content = new Panel
{
Dock = DockStyle.Fill,
Padding = new Padding(0)
};
private readonly Panel _header = new Panel
{
Padding = new Padding(0),
Height = 20,
Dock = DockStyle.Top
};
private Action _action;
private bool _mouseDown;
private string _oldPosition;
private Point _point = new Point(0, 0);
public DragDropContainer()
{
Controls.Add(_header);
Controls.Add(_content);
_content.BringToFront();
}
public int ColumnCount { get; set; }
public Color BorderColor { get; set; } = Color.FromArgb(202, 210, 214);
public IEnumerable> Child => _content.Controls.OfType().Select(x => x.Child);
public IEnumerable
public IEnumerable Panels => _content.Controls.OfType();
protected override void InitLayout()
{
base.InitLayout();
for (var i = 0; i < ColumnCount; i++)
{
var panel = new DragDropPanel
{
Name = "" + i,
Width = Width/ColumnCount,
Dock = DockStyle.Right,
Padding = new Padding(5)
};
var label = new Label
{
AutoSize = false,
Width = panel.Width,
Padding = new Padding(0),
Dock = DockStyle.Right,
Name = "" + i,
TextAlign = ContentAlignment.MiddleCenter
};
_content.Controls.Add(panel);
_header.Controls.Add(label);
PaintEventHandler paintAction =
(sender, args) => ControlPaint.DrawBorder(args.Graphics, (sender as Control).ClientRectangle,
BorderColor, ButtonBorderStyle.Solid);
label.Paint += paintAction;
panel.Paint += paintAction;
}
SizeChanged +=
(o, args) =>
{
_content.Controls.OfType().ToList().ForEach(x => { x.Width = Width/ColumnCount; });
_header.Controls.OfType().ToList().ForEach(x => { x.Width = Width/ColumnCount; });
};
}
public void Add(Control control, int? position = null)
{
var panels = _content.Controls.OfType().ToArray();
if (panels.Length < 1)
{
InitLayout();
panels = _content.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;
panel.Cursor = Cursors.NoMove2D;
_mouseDown = true;
_point = args.Location;
panel.Dock = DockStyle.None;
panel.BringToFront();
_oldPosition = panel.Parent.Name;
}, (sender, args) =>
{
//mouseUp
var panel = control.Parent;
panel.Cursor = DefaultCursor;
panel.Dock = DockStyle.Top;
_mouseDown = false;
panel.BringToFront();
if (panel.Parent.Name != _oldPosition)
{
var newIndex = int.Parse(dragDropPanel.Name);
_action?.Invoke(newIndex, control);
}
}, (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 (_content.Controls.Count > panelIndex + 1)
{
dragDropPanel = _content.Controls[panelIndex + 1] as DragDropPanel;
if (dragDropPanel != null)
{
dragDropPanel.Controls.Add(panel);
panel.Location = location;
panel.BringToFront();
}
}
}
// 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 (_content.Controls.Count > panelIndex - 1 && panelIndex > 0)
{
dragDropPanel = _content.Controls[panelIndex - 1] as DragDropPanel;
if (dragDropPanel != null)
{
dragDropPanel.Controls.Add(panel);
panel.Location = location;
panel.BringToFront();
}
}
}
}
});
}
public void Reset()
{
_header.Controls.OfType().ToList().ForEach(x => x.Dispose());
_content.Controls.OfType().ToList().ForEach(x => x.Dispose());
_header.Controls.Clear();
_content.Controls.Clear();
}
public void SetHandler(Action action)
{
_action = action;
}
}
[ToolboxItem(false)]
internal class DragDropPanel : Panel
{
public IEnumerable Child => Controls.OfType().
Select(x => x.Controls.OfType().FirstOrDefault(t => t.Dock != DockStyle.Left));
public void AddControl(Control control,
MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
{
new Thread(() => Invoke(new EventHandler((sender, args) =>
{
var panel = new Panel
{
Size = new Size(Width, control.Height),
Dock = DockStyle.Top
};
var header = new Panel
{
Dock = DockStyle.Left,
Width = 12,
BackgroundImage = Resources.arrow_move,
BackgroundImageLayout = ImageLayout.Zoom
};
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;
})))
{IsBackground = true}.Start();
}
protected override void InitLayout()
{
base.InitLayout();
AutoScroll = true;
}
}
}
Foydalanish
dragDropContainer1.ColumnCount = 5;
var linkLabel = new LinkLabel
{
Name ="test1",
Text = "Ism Familiya"
};
dragDropContainer1.Add(linkLabel, 1);
dragDropContainer1.Headers.FirstOrDefault().Text = "1-soha";
dragDropContainer1.Headers.ToArray()[2].Text = "2- soha";
dragDropContainer1.SetHandler((i, control) =>
{
MessageBox.Show(string.Format("{0},{1}", i, (control as LinkLabel)?.Text));
var position = dragDropContainer1.Child;
});
Oldingi versiyada aytilganidek biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolinadi va unga Action bajartiriladi. DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ldi.
Shuningdek har bir panel tepasiga sarlavha ko`rinishida soha nomini yozib qo`yish mumkin, hamda sohalarga border rangini ham tanlash mumkin bo`ldi.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
namespace Library.Controls
{
public class DragDropContainer : Control
{
private readonly Panel _content = new Panel
{
Dock = DockStyle.Fill,
Padding = new Padding(0)
};
private readonly Panel _header = new Panel
{
Padding = new Padding(0),
Height = 20,
Dock = DockStyle.Top
};
private Action
private bool _mouseDown;
private string _oldPosition;
private Point _point = new Point(0, 0);
public DragDropContainer()
{
Controls.Add(_header);
Controls.Add(_content);
_content.BringToFront();
}
public int ColumnCount { get; set; }
public Color BorderColor { get; set; } = Color.FromArgb(202, 210, 214);
public IEnumerable
public IEnumerable
public IEnumerable
protected override void InitLayout()
{
base.InitLayout();
for (var i = 0; i < ColumnCount; i++)
{
var panel = new DragDropPanel
{
Name = "" + i,
Width = Width/ColumnCount,
Dock = DockStyle.Right,
Padding = new Padding(5)
};
var label = new Label
{
AutoSize = false,
Width = panel.Width,
Padding = new Padding(0),
Dock = DockStyle.Right,
Name = "" + i,
TextAlign = ContentAlignment.MiddleCenter
};
_content.Controls.Add(panel);
_header.Controls.Add(label);
PaintEventHandler paintAction =
(sender, args) => ControlPaint.DrawBorder(args.Graphics, (sender as Control).ClientRectangle,
BorderColor, ButtonBorderStyle.Solid);
label.Paint += paintAction;
panel.Paint += paintAction;
}
SizeChanged +=
(o, args) =>
{
_content.Controls.OfType
_header.Controls.OfType
};
}
public void Add(Control control, int? position = null)
{
var panels = _content.Controls.OfType
if (panels.Length < 1)
{
InitLayout();
panels = _content.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;
panel.Cursor = Cursors.NoMove2D;
_mouseDown = true;
_point = args.Location;
panel.Dock = DockStyle.None;
panel.BringToFront();
_oldPosition = panel.Parent.Name;
}, (sender, args) =>
{
//mouseUp
var panel = control.Parent;
panel.Cursor = DefaultCursor;
panel.Dock = DockStyle.Top;
_mouseDown = false;
panel.BringToFront();
if (panel.Parent.Name != _oldPosition)
{
var newIndex = int.Parse(dragDropPanel.Name);
_action?.Invoke(newIndex, control);
}
}, (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 (_content.Controls.Count > panelIndex + 1)
{
dragDropPanel = _content.Controls[panelIndex + 1] as DragDropPanel;
if (dragDropPanel != null)
{
dragDropPanel.Controls.Add(panel);
panel.Location = location;
panel.BringToFront();
}
}
}
// 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 (_content.Controls.Count > panelIndex - 1 && panelIndex > 0)
{
dragDropPanel = _content.Controls[panelIndex - 1] as DragDropPanel;
if (dragDropPanel != null)
{
dragDropPanel.Controls.Add(panel);
panel.Location = location;
panel.BringToFront();
}
}
}
}
});
}
public void Reset()
{
_header.Controls.OfType
_content.Controls.OfType
_header.Controls.Clear();
_content.Controls.Clear();
}
public void SetHandler(Action
{
_action = action;
}
}
[ToolboxItem(false)]
internal class DragDropPanel : Panel
{
public IEnumerable
Select(x => x.Controls.OfType
public void AddControl(Control control,
MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
{
new Thread(() => Invoke(new EventHandler((sender, args) =>
{
var panel = new Panel
{
Size = new Size(Width, control.Height),
Dock = DockStyle.Top
};
var header = new Panel
{
Dock = DockStyle.Left,
Width = 12,
BackgroundImage = Resources.arrow_move,
BackgroundImageLayout = ImageLayout.Zoom
};
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;
})))
{IsBackground = true}.Start();
}
protected override void InitLayout()
{
base.InitLayout();
AutoScroll = true;
}
}
}
Foydalanish
dragDropContainer1.ColumnCount = 5;
var linkLabel = new LinkLabel
{
Name ="test1",
Text = "Ism Familiya"
};
dragDropContainer1.Add(linkLabel, 1);
dragDropContainer1.Headers.FirstOrDefault().Text = "1-soha";
dragDropContainer1.Headers.ToArray()[2].Text = "2- soha";
dragDropContainer1.SetHandler((i, control) =>
{
MessageBox.Show(string.Format("{0},{1}", i, (control as LinkLabel)?.Text));
var position = dragDropContainer1.Child;
});
No comments:
Post a Comment