试图提出事件c#

时间:2012-04-18 16:54:15

标签: c# events event-handling

我一直在研究其他许多答案和例子,我对如何设置它越来越感到困惑。我需要根据表单类中的performMove方法的结果在Robot类中引发一个事件。我知道我不能从另一个班级提出这个事件,所以我显然不起作用。但我真的没有理解如何正确设置它。我已经阅读了有关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");

    }
}

3 个答案:

答案 0 :(得分:13)

这个问题很混乱。

您应该向自己提出的问题是:谁负责宣布和执行政策?你有两个实体:“形式”和“机器人”。您对机器人的法律地位有一些政策。哪个班级负责制定该政策? 机器人是否知道它何时超出范围,并通知该事实的形式?或表单知道机器人何时超出范围,并且它通知机器人该事实?

希望被通知的事情是事件监听器希望通知其他人违反政策的内容是事件来源。完全不清楚你希望哪些事情成为听众,哪一部分你想成为听众。但是你违反的规则很明确:事件监听器不是事件发生时允许说的事情聆听演唱会的人不会站起来向钢琴演奏者发出关于按哪些键的指示!那是钢琴家的决定,听众只是决定是否听,以及如何反应。

如果表单决定机器人何时超出范围,则机器人需要成为监听器。如果机器人决定何时表单超出范围,则表单需要成为监听器。现在你已经将表单作为监听器了,但是当它超出范围时它正试图告诉机器人

答案 1 :(得分:2)

您似乎不需要活动。现在,调用moveRobot.coor_Within_Range()只是一种复杂的方式。切出中间人:

    if (x < -100 && x > 100)
    {
        moveRobot.coor_Within_Range();
        x = loc.X;
    }

虽然Within_Range和outOfRange奇怪地反对名字。

您需要一个活动来通知表格,了解机器人中发生的事情。我发布了answer here关于如何做到这一点。

答案 2 :(得分:0)

您的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");
}