2

我的 c# winform 项目有问题。

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

私人无效myText_MouseUp(对象发送者,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.

如果有人可以帮助我,那将对我有很大帮助:)

4

1 回答 1

2

if语句的计算结果始终为真。这意味着最终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

于 2012-05-19T09:46:12.840 回答