我在Form中有一个TableLayoutPanel,并且TableLayoutPanel在其某些单元格中有五个Picturebox控件。我想做的是,根据作为参数传递的坐标列表将这些Picturebox移动到不同的单元格。从用户的角度来看,那些Picturebox将从一个单元格中消失并重新出现在另一个单元格中。(就像一个瓦片基础游戏中的主角,角色在一个单元格中消失并重新出现在相邻的单元格中)。 update方法在Form类中,它由另一个类的方法调用。问题是,它不显示每个动作。它只显示所有Picturebox的初始位置,然后是一些刷新,然后是最终位置。它应该在到达最终坐标之前在每个坐标中显示PictureBoxes。我试过Thread.Sleep()但它不起作用。我该如何解决这个问题?
[Error]: {"code":1,"message":"Internal server error."} (Code: 1, Version: 1.12.0)
Code=3840 "JSON text did not start with array or object and option to allow fragments not set."
更新 我根据建议修改了我的代码。但是,问题仍然存在。似乎它正在重绘整个tablelayoutpanel而不是将图片框从一个单元格移动到另一个单元格。我可以看到tablelayoutpanel的清爽。
Type PPConnectionException
Message error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
Detail Error connecting to https://api-3t.sandbox.paypal.com/2.0
更新 使用suspendLayout和improveLayout,可以改进重绘。但我想知道是否有可能不重绘tablelayout而只是重绘图片框,以便只显示图片框正在移动。
答案 0 :(得分:0)
我希望这有效。假设您已将图片框名称的临时列表设置为List,您可以从中检索名称并找到它们移动到另一个位置。因此,基本上在我的方法中,您只需将其位置移动到tablelayout面板中的另一个单元格。 您可以使用“foreach”循环来检索图片框,而不是为图片框的每个control.name迭代相同的Controls.Find()函数来优化它。
public void update(Position k, List<Position> p)
{
PictureBox p1 = this.Controls.Find("/* the picturebox name*/", true).FirstOrDefault() as PictureBox;
PictureBox p2 = this.Controls.Find("/* the picturebox name*/", true).FirstOrDefault() as PictureBox;
PictureBox p3 = this.Controls.Find("/* the picturebox name*/", true).FirstOrDefault() as PictureBox;
PictureBox p4 = this.Controls.Find("/* the picturebox name*/", true).FirstOrDefault() as PictureBox;
PictureBox p5 = this.Controls.Find("/* the picturebox name*/", true).FirstOrDefault() as PictureBox;
this.board.Controls.Remove(p1);
this.board.Controls.Remove(p2);
this.board.Controls.Remove(p3);
this.board.Controls.Remove(p4);
this.board.Controls.Remove(p5);
//p1_picturebox.Visible = false;
//p2_picturebox.Visible = false;
//p3_picturebox.Visible = false;
//p4_picturebox.Visible = false;
//p5_picturebox.Visible = false;
// Load images in new positions
//this.board.Controls.Add(k_picturebox, k.col, knight.row);
this.board.Controls.Add(p1, p[0].col, p[0].row);
this.board.Controls.Add(p2, p[1].col, p[1].row);
this.board.Controls.Add(p3, p[2].col, p[2].row);
this.board.Controls.Add(p4, p[3].col, p[3].row);
this.board.Controls.Add(p5, p[4].col, p[4].row);
//alternatively for the whole above code you may optimize like below.
int i = 0;
foreach(Control c in PictureBoxList) //PictureBoxList is retrieved as List<Control>
{
PictureBox p1 = this.Controls.Find(c.Name, true).FirstOrDefault() as PictureBox;
p1.Name = c.Name; //assign new name from the same list which contains pictureboxes and can get name by using c.Name
this.board.Controls.Remove(p1);
this.board.Controls.Add(p1, p[i].col, p[i].row);
i++;
}
------UPDATED-------- -
this.Invalidate();
Thread.Sleep(3000);
}
<强>更新强>
您是否尝试将Picturebox的 WaitOnLoad 属性设置为 true ?
<强> UPDATE2:强>
尝试使主板,然后新图片框无效。