将控件添加到在运行时创建的另一个控件

时间:2016-04-24 17:58:14

标签: c#

我正在尝试将一个picturebox控件添加到在运行时创建的面板中。 这是我正在进行的国际象棋比赛。我想为每个面板添加一个图片框,稍后将图像分配给控件。以下是我到目前为止的情况:

//Sets the number of rows on the chess board
for (int i = 0; i < 8; i++)         
{ 
    //Set the number of columns on the board
    for (int j = 0; j < 8; j++)     
    {
        ChessSquare sq = new ChessSquare(((char)(65 + i)).ToString(), 7- j);
        sq.Color = (i + (j % 2)) % 2 == 0 ? Color.Black : Color.White;

        Panel p = new Panel()
        {
            Size = new Size(blockSize, blockSize),
            BackColor = sq.Color,
            Tag = sq,
            Location = new Point(blockSize * i + 15, blockSize * j + 15),
            BackgroundImageLayout = ImageLayout.Stretch
        };
        p.MouseEnter += new EventHandler(squareMouseEnter);
        p.MouseLeave += new EventHandler(squareMouseLeave);
        p.Click += new EventHandler(squareMouseClick);

        chessBoardPanels[i, j] = p;
        groupBox1.Controls.Add(p);
    }
}
//SetUp Board
SetUpBoad Setup = new SetUpBoad();
SetUpBoad(chessBoardPanels);

1 个答案:

答案 0 :(得分:1)

由于您已将Panels放入面板数组(?)

chessBoardPanels[i, j] = p;

您可以现在或稍后添加PictureBoxes ..:

PictureBox pb = new PictureBox ();
pb.Size = ..
pb.BackColor = Color.Transparent;

chessBoardPanels[i,j].Controls.Add(pb);

要稍后访问它们,您可以将其第一个Control投射到PictureBox

PictureBox pb = (PictureBox)chessBoardPanels[i,j].Controls[0];
pb.Image = aQueenImage;

如果您只想在片段中添加PictureBox,则需要进行检查:

if (chessBoardPanels[i,j].Controls.Count > 0)
{
   PictureBox pb = (PictureBox)chessBoardPanels[i,j].Controls[0];
   pb.Image = aQueenImage;
}

要将作品从<i1,j1>移动到<i2, j2>,您可以按预期进行操作:

chessBoardPanels[i1,j1].Controls[0].Parent = chessBoardPanels[i2,j2];

我注意到你正在连接鼠标事件。如果你想使用它们来移动棋子,请记住透明度不适用于Winforms中的重叠控件,因此当一个棋子正在越过Panels时,它将不具有工作透明度Image

虽然pBox嵌套在Panel中但一切都很好但是要移动它,你必须首先使它成为这些面板的父级的子级,并且只在Panel上将它添加到目标MouseUp };可以解决坐标修正问题,但如果需要,透明度将是一个更大的问题。

通常建议考虑drawing至少那些棋盘方块,甚至可能是棋盘上的棋子 - Panel(或棋盘 - PictureBox