我的WindowsForm上有一排面板,每个面板上有两个按钮,上移和下移。我想要它,以便当用户点击它时切换当前面板,其下面的面板基本取代它。 (将它们交换)。我有10个同一个面板的实例,所以像下面这样简单的东西不起作用,因为所有的面板都叫做DataPanel。任何帮助表示赞赏。
private void MoveDownEnabled_Click(object sender, EventArgs e)
{
Point temp = DataPanel.location;
DataPanel.Location = Panel2.Location;
Panel2.Location = temp;
}
答案 0 :(得分:1)
我建议将Panel
存储在一个集合中,作为开始。这将使访问下一个面板的代码非常干净。
ArrayList panels = new ArrayList();
panels.add(panel);
panels.add(panel2);
panels.add(panel3);
ANd还会保留一个值index
,以显示您在列表中的位置。
private int index = 0; // Set it to a default value.
然后修改您的按钮点击代码:
private void MoveDownEnabled_Click(object sender, EventArgs e)
{
Panel Current = panels.get(index);
if(index < panels.Count)
{
// Grab the next item.
Panel Next = panels.get(++ index);
// And this part is up to you!
}
}
你似乎对你如何交换它们有正确的想法,所以我想现在我已经为你设置了这个,你可以自己动手休息。
答案 1 :(得分:0)
不要使用变量名来区分运行时的控件,使用它们的属性或它们的实例。在这种情况下,您可以使用Panel的Name
属性来区分,或者可以保存对象类型的Tag
属性。此外,我建议将Panel存储在List等集合中,以便可以轻松地迭代和访问它们。
例如(作为一般概念)
//won't get nested panels but sounds like you don't need that
var listOfPanels = this.Controls.OfType<Panel>().ToList();
//access the panel you want by name
Panel pnl = listOfPanels.Where(x => x.Name == "panelName").FirstOrDefault();
在您的情况下,您的Panel事件将作为sender
发送到事件处理程序中。
private void MoveDownEnabled_Click(object sender, EventArgs e)
{
Panel selectedPanel = sender as Panel;
if(selectedPanel != null)
{
Point temp = DataPanel.location;
DataPanel.Location = selectedPanel.Location;
selectedPanel.Location = temp;
}
}
答案 2 :(得分:0)
我认为一个简单的交换方法应该这样做:
public void SwapPanels(System.Windows.Forms.Panel pnl1, System.Windows.Forms.Panel pnl2) { var localtion1 = pnl1.Location; var location2 = pnl2.Location; pnl2.Location = localtion1; pnl1.Location = location2; }
如果要交换任意两个面板,只需调用此方法即可交换它们。如果您有许多面板,只需将它们存储在列表中,然后自由交换。