我的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.
如果有人可以帮助我,那将有助于我:)
答案 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
。