cookie
1
안녕하세요 C# 독학중인 초급개발자입니다!
flowLayoutPanel에서 Control을 마우스 드레그/드랍으로 순서를 변경하려고 합니다.
flowLayoutPanel에서 childIndex로 순서를 정하는데 해당 Control의 childindex를 구할 수 있는 방법이 있을까요?
[적용하려는 방법]
- Control_MouseDown 이벤트에서 선택한 컨트롤 childindex와 name을 변수에 저장.
- Control_MouseMove 현재 마우스의 포인트를 flowLayoutPanel의 컨트롤들의 포인트를 비교해서 가장 인접합 컨트롤의 childindex를 구해 다음 childindex로 순서를 변경하려고합니다.
3 Likes
SDB
2
Control의 ChildIndex는 flowLayoutPanel의 Controls.GetChildIndex 함수로 구할 수 있습니다.
그리고 위 기능을 구현하는데 드래그 앤 드랍 이벤트로 하면 쉽게 구현할 수 있을 것 같습니다.
// item 추가하는 로직에서
private void AddItem()
{
var item = new Control();
item.AllowDrop = true;
item.MouseDown += Item_MouseDown;
item.DragEnter += item_DragEnter;
item.DragDrop += item_DragDrop;
flowLayoutPanel.Controls.Add(item);
}
private void Item_MouseDown(object sender, MouseEventArgs e)
{
DoDragDrop((sender as Control).Name, DragDropEffects.Copy);
}
private void Item_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(string)))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void Item_DragDrop(object sender, DragEventArgs e)
{
var items = flowLayoutPanel.Controls;
var targetItemChildIndex = items.GetChildIndex(sender as Control);
var sourceItemName = e.Data.GetData(DataFormats.StringFormat);
for (int i = 0, count = items.Count; i < count; i++)
{
if (items[i].Name == sourceItemName)
{
items.SetChildIndex(items[i], targetItemChildIndex);
break;
}
}
}
5 Likes