Visual Studio 2010 - C# UserControl 事件触发

本文关键字:事件 UserControl Studio 2010 Visual | 更新日期: 2023-09-27 18:31:34

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

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

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

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

非常感谢,利亚姆

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

gridSpaces.Add(gs11.Name, gs11);

其中 gs11 是 GridSquare 的名称。

从这里开始,我尝试为地牢屏幕上的单个用户控件创建事件处理程序,但调用失败。

Visual Studio 2010 - C# UserControl 事件触发

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

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;
        }
    }
    }

这会将 Click 事件添加到用户控件中的所有内容中,我希望我没有犯任何错误,并且这有助于

您可以对每个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
}