“打开面板”按钮事件
本文关键字:按钮 事件 打开面板 | 更新日期: 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; }
如果要交换任意两个面板,只需调用此方法即可交换它们。如果你有很多面板,只需将它们存储在一个列表中,然后自由交换。