C#动态表单帮助

时间:2011-02-07 15:09:15

标签: c# forms dynamic onclick

我正在尝试使用图片框在C#中创建一个Tile-Map编辑器(我认为最简单的方法是将图块投入到表单中)

生成图片框的代码是:

public void Generate_Tiles(int width, int height)
        {
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    System.Windows.Forms.PictureBox picturebox = new PictureBox();
                    picturebox.BackColor = SystemColors.ActiveCaption;
                    picturebox.Cursor = Cursors.Cross;
                    picturebox.Location = new System.Drawing.Point((x*32) + 4, (y*32) + 4);
                    picturebox.Name = x+y+"tile";
                    picturebox.Size = new System.Drawing.Size(32, 32);
                    picturebox.TabIndex = 0;
                    picturebox.TabStop = false;
                    picturebox.Click += new System.EventHandler(TileBox_Clicked));
                    map.Controls.Add(picturebox);
                }
            }
            MessageBox.Show("Done");
        }

该部分有效,只要我一次使用少量图片框(8×8似乎是它想要在相当长的时间内显示的最大值)

我想在用户点击指定的图片框时执行一些操作,这就是为什么我有一个onclick方法,这就是我遇到问题的地方,所有的图片框都被称为...图片框。据我所知,我无法分辨用户点击的图片框。

我可能需要重新制作动态表单的工作方式,因为我无法获得很多图片框,但我认为主要问题仍然存在,只要我希望它是动态的(我做的) ),并非所有的瓷砖地图都是相同的尺寸。

我从来没有做过这样的事情,我已经找到了覆盖onclick事件的方法......这是我找不到的,而且我找不到一个最新的好用的瓷砖引擎(除了XNA,但对于一个简单的拼贴编辑器来说,这有点超过顶部,我认为)

我可能会朝着与我需要做的相反的方向前进。

5 个答案:

答案 0 :(得分:3)

您的事件处理程序中的发件人将是被点击的PictureBox

    void TileBox_Clicked(object sender, EventArgs e)
    {
        PictureBox pictureBox = sender as PictureBox;
        if(pictureBox != null)
        {
            //do stuff with your pictureBox
        }
    }

答案 1 :(得分:1)

您是否只能将发件人对象转换为事件处理程序中的PictureBox,并使用它?

答案 2 :(得分:0)

事件处理程序中的第一个参数是单击的控件(将是PictureBox。

private void pictureBox1_Click(object sender, System.EventArgs e)
{
   PictureBox pb = (PictureBox)sender;

   // ...
}

答案 3 :(得分:0)

我也使用了地图图块编辑器。正如其他人所说,您可以使用sender参数并将其强制转换为PictureBox以获取被单击的PictureBox对象。但是我认为你会发现(你可能已经拥有)一个体面的地图尺寸会让事情变慢。

您可能会重新考虑XNA。它似乎很复杂,并且只是生成一堆PictureBox对象并不容易。但它很快,你可以很快地显示2D地图。您还可以更轻松地扩展它,例如,如果您希望地图具有不同的可编辑图层(地形等)。

答案 4 :(得分:0)

实际上有很多方法可以做到这一点。我认为最简单的方法是使用事件处理程序的sender,它会将您返回到单击的按钮:

private void PictureBox_Click(object sender, EventArgs e)
{
     var box = sender as PictureBox;
     if (box != null)
     {
         //...

您还可以动态创建和添加事件处理程序,这是一个有趣的选项:

        //...
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                System.Windows.Forms.PictureBox picturebox = new PictureBox();

                pictureBox.Click += new Action<object, EventArgs>(
                     (sender, e) => { doStuff(pictureBox); }
                );

在上面的代码中,doStuff获取pictureBox作为参数,因此它知道它应该在哪个对象上工作。