“打开面板”按钮事件

本文关键字:按钮 事件 打开面板 | 更新日期: 2023-09-27 18:25:57

我的WindowsForm上有一行面板,每个面板上有两个按钮,"上移"answers"下移"。我希望它能在用户点击时切换当前面板,使其下方的面板基本上占据它的位置。(交换)。我有同一个面板的10个实例,所以下面这样简单的东西不起作用,因为所有的面板都被称为DataPanel。感谢您的帮助。

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

“打开面板”按钮事件

首先,我建议将Panel存储在集合中。这将使访问下一个面板的代码变得非常干净。

ArrayList panels = new ArrayList();
panels.add(panel);
panels.add(panel2);
panels.add(panel3);

AN还保留一个值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!
    }
 }

你似乎对如何交换它们有正确的想法,所以我想现在我已经为你设置好了,剩下的你可以自己解决了。

不要在运行时使用变量名来区分控件,而是使用它们的属性或实例。在这种情况下,您可以使用Panel的Name属性进行区分,也可以使用它的Tag属性来保存对象类型。此外,我建议将Panels存储在一个集合中,例如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发送给Panel。

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

我认为一个简单的交换方法应该做到:

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

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