Visual Studio 2010 - C#UserControl事件触发

问题描述:

我试图在Visual Studio 2010中制作基于网格的地牢系统。我有一个主要的用户控件,其中包含64个其他较小的用户控件对象,我称之为GridSquares,组织成8x8网格。网格广场背后的想法是充当“地下城”内潜在的运动空间。我目前遇到的问题是我需要能够在用户控件(GridSquares)上自己调用点击事件,这些事件已放置在屏幕上,因此我可以检索它们的坐标(名称)以进行比较。然而,当我打电话时(通过点击)该事件不起作用。Visual Studio 2010 - C#UserControl事件触发

我知道,当我把它们放在usercontrol(GridSquare对象)内时,这些事件工作,但当用户控件本身被点击时,我甚至需要点击来工作。

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

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

非常感谢,利亚姆

编辑: 我不知道有多少,这将有助于或显示什么代码,但GridSpace控制已经被添加到“地牢”用户控制。然后,我将所有64添加到字典中:

gridSpaces.Add(gs11.Name, gs11); 

其中gs11是GridSquare的名称。

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

+0

Windows窗体或WPF? – 2012-04-17 13:48:39

+0

我正在使用Windows Forms – Lazz 2012-04-17 14:07:45

+0

你能发表一些代码吗? – 2012-04-17 14:33:09

我觉得我得到了你的说法。此代码添加到您的用户控件:

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

这会在你的用户控件,我希望我没有做任何的错误,单击事件添加到的一切,这有助于

+0

这绝对是完美的。它正是我需要它做的。非常感谢你 – Lazz 2012-04-17 14:55:35

+0

没问题:)我在制作自定义按钮时遇到了完全相同的问题 – Oztaco 2012-04-17 15:30:49

您可以使用每个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 
} 
+0

谢谢你的建议。问题在于主用户控件不会在实际的网格方形对象上注册点击事件,而只是在它们内部发生了什么。 – Lazz 2012-04-17 14:01:41

+0

@Lazz,听起来像是把你的一些代码添加到问题的好时机。 :) – Bazzz 2012-04-17 14:08:49