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;
}
}
}