替换按钮位置

时间:2012-05-19 08:06:38

标签: c# winforms

我的c#winform项目有问题。

在我的项目中,我有一个功能,可以将按钮的位置切换到旧位置,如果它们位于同一区域。

private void myText_MouseUp(object sender,MouseEventArgs e)     {

Point q = new Point(0, 0);
        Point q2 = new Point(0, 0);
        bool flag = false;
        int r = 0;
        foreach (Control p in this.Controls)
        {
            for (int i = 0; i < counter; i++)
            {
                if (flag)
                {
                    if (p.Location.X == locationx[i] && p.Location.Y == locationy[i])
                    {
                        oldx = e.X;
                        oldy = e.Y;
                        flag = true;
                        r = i;
                    }
                }
            }
        }
        foreach (Control p in this.Controls)
        {
            for (int j = 0; j < counter; j++)
            {
                if ((locationx[j] == p.Location.X) && (locationy[j] == p.Location.Y))
                {
                    Point arrr = new Point(oldx, oldy);
                    buttons[j].Location = arrr;
                    buttons[r].Location = new Point(locationx[j], locationy[j]);
                }
            }
        }
}
   The problem with this code is that if they are in the same area, the buttons do not switch their locations.  Instead they goes to the last button location.

如果有人可以帮助我,那将有助于我:)

1 个答案:

答案 0 :(得分:2)

if语句始终求值为true。这意味着最终的j循环将执行此操作:

// last time round the i loop, i == counter-1
// and q == new Point(locationx[counter-1], locationy[counter-1])
for (int j = 0; j < counter; j++)
{
    Point q2 = new Point(locationx[j], locationy[j]);
    buttons[i].Location = q2;
    buttons[j].Location = q;
}

最终结果是每个按钮的Location都设置为q,这是

new Point(locationx[counter-1], locationy[counter-1])

为什么if语句始终评估为true。好吧,首先让我们看一下or语句中的几个if子句:

|| ((q.Y >= q2.Y) && (q.X <= q2.X))
|| ((q.Y >= q2.Y) && (q.X == q2.X))

这相当于

|| ((q.Y >= q2.Y) && (q.X <= q2.X))

包含==测试的行对条件的最终结果完全没有影响。事实上,包含==的所有行都可以进行类似的处理。这留下了:

|| ((q.Y >= q2.Y) && (q.X <= q2.X))
|| ((q.Y >= q2.Y) && (q.X >= q2.X))
|| ((q.Y <= q2.Y) && (q.X >= q2.X))
|| ((q.Y <= q2.Y) && (q.X <= q2.X))

我们可以压缩

|| ((q.Y >= q2.Y) && (q.X <= q2.X))
|| ((q.Y >= q2.Y) && (q.X >= q2.X))

进入

|| ((q.Y >= q2.Y)

和类似的

|| ((q.Y <= q2.Y) && (q.X >= q2.X))
|| ((q.Y <= q2.Y) && (q.X <= q2.X))

相同
|| ((q.Y <= q2.Y)

联合

|| ((q.Y >= q2.Y)
|| ((q.Y <= q2.Y)

您可以看到if条件始终评估为true