0

我正在尝试在 Visual Studio 2010 中制作基于网格的地下城系统。我有一个主用户控件,其中包含 64 个其他较小的用户控件对象,我称之为 GridSquares,组织成一个 8x8 网格。网格方块背后的想法是充当“地牢”内的潜在移动空间。我目前遇到的问题是我需要能够在用户控件(GridSquares)本身上调用点击事件,这些控件已放置在屏幕上,以便我可以检索它们的坐标(名称)进行比较。但是,当我调用它(通过单击)时,该事件不起作用。

我知道当我将它们放在用户控件(GridSquare 对象)中时,这些事件会起作用,但是当单击用户控件本身时,我甚至需要单击才能起作用。

鉴于放置的所有 64 个对象都是同一类型,我无法在 GridSquare 类中工作,因为我需要通过事件返回用户控件的名称。

我希望这是有道理的,但请询问我是否需要进一步解释。

非常感谢,利亚姆

编辑:我不确定这将有多大帮助或显示什么代码,但 GridSpace 控件已添加到“地牢”用户控件中。然后在我将所有 64 个添加到字典中:

gridSpaces.Add(gs11.Name, gs11);

其中 gs11 是 GridSquare 的名称。

从这里我尝试为地牢屏幕上的各个用户控件创建事件处理程序,但未能调用。

4

2 回答 2

0

您可以为每个处理程序使用相同的处理程序,GridSquare并使用sender参数来确定单击了哪个处理程序:

protected void Page_Load(object sender, EventArgs e)
{
   for (int i = 0; i < 64; i++)
   {
      GridSquare square = new GridSquare();
      square.Click += new EventHandler(gridSquare_Click);
      grid.Add(gridSquare);
   }
}

void gridSquare_Click(object sender, EventArgs e)
{
   GridSquare square = (GridSquare)sender;
   // do something cool with the clicked square here
}
于 2012-04-17T13:53:16.623 回答
0

我想我明白你的意思。将此代码添加到您的用户控件:

public new event EventHandler Click {
    Add {
        base.Click += value;
        foreach(Control i in Controls) {
            i.Click+=value;
        }
    }
    remove {
        base.Click -= value;
        foreach(Control i in Controls) {
            i.Click -= value;
        }
    }
    }

这会将点击事件添加到您的用户控件中的所有内容中,我希望我没有犯任何错误,这会有所帮助

于 2012-04-17T14:42:59.470 回答