0

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

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

3 回答 3

1

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

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

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

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

于 2013-08-01T08:53:34.067 回答
0

不要在运行时使用您的变量名称来区分控件,而是使用它们的属性或它们的实例。在这种情况下,您可以使用 Panel 的Name属性来区分,或者它的Tag属性可以容纳一个对象类型。此外,我建议将面板存储在列表等集合中,以便可以轻松地对其进行迭代和访问。

例如(作为一个总体思路)

//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;
    }
}
于 2013-08-01T08:56:44.083 回答
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;
    }

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

于 2013-08-01T08:57:38.680 回答