将TableLayoutPanel内的Picturebox从一个单元格移动到另一个单元格,并延迟

时间:2016-02-16 06:50:07

标签: c# winforms picturebox tablelayoutpanel

我在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而只是重绘图片框,以便只显示图片框正在移动。

1 个答案:

答案 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:

  

尝试使主板,然后新图片框无效。