按钮事件切换面板

时间:2013-08-01 08:46:39

标签: c# winforms

我的WindowsForm上有一排面板,每个面板上有两个按钮,上移和下移。我想要它,以便当用户点击它时切换当前面板,其下面的面板基本取代它。 (将它们交换)。我有10个同一个面板的实例,所以像下面这样简单的东西不起作用,因为所有的面板都叫做DataPanel。任何帮助表示赞赏。

 private void MoveDownEnabled_Click(object sender, EventArgs e)
    {
        Point temp = DataPanel.location;
        DataPanel.Location = Panel2.Location;
        Panel2.Location = temp;
    }

3 个答案:

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

如果要交换任意两个面板,只需调用此方法即可交换它们。如果您有许多面板,只需将它们存储在列表中,然后自由交换。