我一直在研究许多其他关于这个问题的答案和例子,我只是对如何设置它越来越困惑。我需要根据表单类中 performMove 方法的结果在机器人类中引发一个事件。我知道我不能从另一个班级提出事件,所以我所拥有的显然是行不通的。但我真的不明白如何正确设置它。我已经阅读了有关codeProject,dreamInCode和本网站等的代表和活动文章。这是针对初学者 c# 课程的,我对此很陌生,因为我相信每个人都能看出:)
namespace Assignment12
{
public delegate void ErrorHandler();
public partial class frmRobot : Form
{
Robot moveRobot = new Robot();
public frmRobot()
{
InitializeComponent();
reset_Position();
current_Position_Display();
moveRobot.outOfRange += new ErrorHandler(moveRobot.coor_Within_Range);
}
...
private void performMove()
{
Point loc = lblArrow.Location;
int x = moveRobot.Move_Robot_XAxis(loc.X);
int y = moveRobot.Move_Robot_YAxis(loc.Y);
if (x < -100 && x > 100)
{
moveRobot.outOfRange();
x = loc.X;
}
if (y < -100 && y > 100)
{
moveRobot.outOfRange();
y = loc.Y;
}
this.lblArrow.Location = new Point(x, y);
current_Position_Display();
}
class Robot
{
public event ErrorHandler outOfRange;
...
public void coor_Within_Range()
{
System.Console.WriteLine("TestOK");
}
}
这个问题很混乱。
你应该问自己的问题是:谁负责宣布和执行政策?您有两个实体:"表单"和"机器人"。您有一些关于机器人的法律地位的政策。哪个班级负责制定该政策?机器人是否知道何时超出范围,并告知该事实的形式? 或者表单是否知道机器人何时超出范围,并通知机器人这一事实?
希望得到通知的是事件侦听器。希望通知其他人违反策略的内容是事件源。完全不清楚你想成为听众中的哪一个,你想成为哪一个的来源。但是你违反的规则很清楚:事件侦听器不是允许在事件发生时说的话。听音乐会的人不会站起来向钢琴家大喊要按什么键!这是钢琴家的决定,听众只能决定是否听,以及如何反应。
如果表单决定机器人何时超出范围,那么机器人需要成为倾听者。如果机器人决定表单何时超出范围,那么表单需要成为听众。现在你已经有了听众的形式,但它试图告诉机器人什么时候超出范围。
你似乎不需要事件。现在,这只是一种复杂的moveRobot.coor_Within_Range()
调用方式。去掉中间人:
if (x < -100 && x > 100)
{
moveRobot.coor_Within_Range();
x = loc.X;
}
尽管Within_Range和OutOfRange是奇怪的相反名称。
您需要一个事件来通知表单有关机器人中发生的事情。我在这里发布了一个关于如何做到这一点的答案。
您的coor_Within_Range
需要引发事件:
public void coor_Within_Range()
{
System.Console.WriteLine("TestOK");
if (this.outOfRange != null) {
this.outOfRange();
}
}
然后在Form
类中,您需要处理事件:
public frmRobot()
{
// snipped
moveRobot.outOfRange += new ErrorHandler(this.oncoor_Within_Range);
}
public void oncoor_Within_Range() {
Console.WriteLine("robot within range");
}