2015-08-10 5 views
1

У меня есть два файла .cs. Я пытаюсь использовать делегат события в этом проекте. Event.cs:Как использовать делегат события на веб-форме C#?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Project3 
{ 
    public delegate int Calculate(int obj1, int obj2); 
    public class Event 
    { 
     public event Calculate CalculateNow; 
     int a = 0; 
     int b = 0; 
     int r = 0; 
     public int Add() 
     { 
      r = a + b; 
      return r; 
     } 

     public int Sub() 
     { 
      r = a - b; 
      return r; 
     } 

     public int Mul() 
     { 
      r = a * b; 
      return r; 

     } 

     public int Div() 
     { 
      r = a/b; 
      return r; 
     } 
    } 
} 

И Form1.cs:

using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Project3 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      label1.Text = ""; 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      Button btn = (Button)sender; 
      label1.Text = btn.Text; 
      int num1 = Int32.Parse(textBox1.Text); 
      int num2 = Int32.Parse(textBox2.Text); 
      Event t = new Event(); 
      t.CalculateNow +=new Calculate(t_CalculateNow); 
      int finalr = t.Add(); 
      if (finalr != null) 
      { 
       label1.Text = "" + finalr; 
      } 
      else 
      { 
       label1.Text = "Error!"; 
      } 
     } 
    } 
} 

Я получил сообщение об ошибке говорит «Имя„t_CalculateNow“не существует в текущем контексте», и я не знаю, как чтобы исправить это. Надеюсь, кто-то ответит мне. Спасибо огромное! Если кто-то может объяснить логику делегата события, это мне очень поможет.

+0

Ну, он не существует в этот контекст, его в классе «Событие» (я бы переименовал этот битва), чего вы пытаетесь достичь? – Sayse

+0

Google может объяснить логику делегатов событий. Amazon также является полезным ресурсом, особенно если вам нравится печатный материал. – Amit

+0

@Sayse Событие выполнит расчет и вернет окончательный ответ. Метка1 покажет ответ в веб-форме. – Alison

ответ

1

В вашем коде отсутствует правильная инициализация и использование событий. Событие нельзя напрямую вызывать из другого класса, однако можно создать метод, который будет вызывать его для публичных подписчиков (в нашем случае это метод InvokeCalc). Похоже, что-то вроде этого shoukd работать для вас:

public class Calculator 
{ 
    public event Calculate CalculateNow; 
    public delegate int Calculate(int x, int y); 

    public string InvokeCalc(int x, int y) 
    { 
     if(CalculateNow != null) return CalculateNow(x, y).ToString(); 
     return null; 
    } 
} 

И тогда в вашем WinForm вы можете использовать:

namespace Project3 
{ 
    public partial class Form1 : Form 
    { 
     private Calculator calc; 

     public Form1() 
     { 
      InitializeComponent(); 
      calc = new Calculator(); 
      label1.Text = ""; 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      Button btn = (Button)sender; 
      label1.Text = btn.Text; 
      int num1 = Int32.Parse(textBox1.Text); 
      int num2 = Int32.Parse(textBox2.Text); 

      // subscribes a handler to your event 
      calc.CalculateNow += (n1, n2) => { return n1 + n2; } 

      // method that invokes your event on Calculator class 
      int finalr = calc.InvokeCalc(num1, num2); 
      if (finalr != null) 
      { 
       label1.Text = "" + finalr; 
      } 
      else 
      { 
       label1.Text = "Error!"; 
      } 
     } 
    } 
} 

P.S. Хотя это пример, который иллюстрирует, как вы можете использовать события, но очень маловероятно, что вам придется использовать события таким образом. Как правило, события должны использоваться для уведомления абонентов (других классов) о том, что произошло событие. Событие может быть запущено только внутри класса, и эта инкапсуляция каким-то образом улучшает целостность приложения, потому что иначе ANY класс или структура могут запускать это событие, и было бы трудно узнать, какой класс действительно вызвал его и где. ..

+1

Я тестировал ваш код, но есть ошибка: имя «Calculate» не существует в текущем контексте. – Alison

+0

@Alison извините меня, я смутил имя делегата 'Calculate' с именем события' CalculateNow' ... Я исправил эту небольшую путаницу – Fabjan

0

Я не думаю, что у вас есть хорошее понимание событий и делегатов. Я думаю, в вашем классе Form1 вы хотите подписаться на событие CalculateNow в классе Event. Вы делаете это правильно, пока это слово t_CalculateNow. Ошибка возникает, потому что действительно, t_CalculateNow не существует нигде. Вы должны добавить этот метод в свой класс формы:

private int t_CalculateNow (int obj1, int obj2) { 
    //do whatever you want when the event occurs in here 
} 

Однако я знаю, что этого не вы достигнете. Вы хотите вычислить некоторые вещи и вернуть их. Поэтому вам даже не нужно событие или делегат, вам просто нужен статический метод.

public static int Calculate (int obj1, int obj2) { 
    //do your calculation here and return the result 
} 

И вы можете использовать это, чтобы установить текст лейбла:

label1.Text = Event.Calculate (0, 0); //0, 0 is just an example, do whatever you need. 

Ссылка на delegtes: https://msdn.microsoft.com/en-us/library/900fyy8e(v=vs.120).aspx

Ссылка на события: https://msdn.microsoft.com/en-us/library/awbftdfh.aspx

+0

Да, я новичок в этой теме. Спасибо за информацию! Это помогает мне разобраться в логике. Спасибо! – Alison

+0

Мое решение работает для вас? @Alison – Sweeper