C# winform flowLayout 순서 변경

안녕하세요 C# 독학중인 초급개발자입니다!

flowLayoutPanel에서 Control을 마우스 드레그/드랍으로 순서를 변경하려고 합니다.

flowLayoutPanel에서 childIndex로 순서를 정하는데 해당 Control의 childindex를 구할 수 있는 방법이 있을까요?

[적용하려는 방법]

  1. Control_MouseDown 이벤트에서 선택한 컨트롤 childindex와 name을 변수에 저장.
  2. Control_MouseMove 현재 마우스의 포인트를 flowLayoutPanel의 컨트롤들의 포인트를 비교해서 가장 인접합 컨트롤의 childindex를 구해 다음 childindex로 순서를 변경하려고합니다.
3개의 좋아요

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개의 좋아요

24년 3월에서 왔습니다.
정말 고맙습니다.

4개의 좋아요