C#:如何交换两个winform控件的位置

Svi*_*ish 5 c# collections controls winforms

假设你有两个人Control,爱丽丝和鲍勃,你想交换他们的位置.我的意思是交换后:

  • 如果他们住在同一个地方ControlCollection,那么Alice应该拥有Bob的索引,反之亦然.
  • 如果在不同的ControlCollections中,Alice应该具有与Bob相同的索引,但是在Bobs中ControlCollection,反之亦然.

你会怎么做?由于ControlCollection方法的工作原理,我有点不确定如何最好地解决这个问题.例如,使用Remove删除控件的方法将更改集合中后面的所有控件的索引.SetChildIndex以类似的方式工作.

编辑: Alice和Bob的父控件是流布局面板.这就是为什么我要交换它们的索引,这将有效地在流布局面板中交换它们的位置.

Bev*_*van 7

对于两个控件都相同的简单情况FlowLayoutPanel,请使用SetChildIndex方法on Controls.

像这样......

var alphaIndex = panel.Controls.IndexOf(controlAlpha);
var betaIndex = panel.Controls.IndexOf(controlBeta);
panel.Controls.SetChildIndex(controlAlpha, betaIndex);
panel.Controls.SetChildIndex(controlBeta, alphaIndex);
Run Code Online (Sandbox Code Playgroud)

注意:我没有正确处理序列 - 你需要先将前一个控件放到位,否则当第二个控件移到它之前时,结果索引将太高.但这对读者来说是一种练习.

对于更复杂的情况,控件在不同的FlowLayoutPanels上,代码更简单(序列无关紧要)和更复杂(每个控件需要从一个面板中删除并添加到另一个面板).