Делегаты и события? - PullRequest
1 голос
/ 23 июня 2010

Этот вопрос относится к c #. Сценарий состоит в том, что, когда я нажимаю кнопку, происходят такие операции, как чтение файла, манипулирование данными и сброс файла. После завершения каждой операции я буду обновлять статус (т.е. , Чтение файла завершено, обработка данных завершена) в метке, которая находится в пользовательском интерфейсе (FORM-frmTesting)

Событие нажатия кнопки

namespace frmTesting
      {
         public partial class Form1 : Form
         {
              private void button1_Click_1(object sender, EventArgs e)
              {
                 class1 l_objClass1 = new class1();
                  l_objClass1.DoOperation();

              }
          }


       public class class1
       {

            public int DoOperation()
            {
                  ReadTextFile();
                  ParsingData();
                  SaveTextFile();
                  return 0;
            }

            private int ReadTextFile()
            {
               //Read the text File
                return 0;

            }

            private int ParsingData()
            {
               // Data manipulation
                return 0;

            }

            private int SaveTextFile()
            {

               // save the file
               return 0;
            }
       }
   }

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

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Вам нужно изменить class1 для трансляции событий, которые могут прослушивать другие классы:

public class class1
{
    // Not necessary, but will allow you to add custom EventArgs later
    public delegate void StatusChangedEventHandler(object sender, EventArgs e);

    public event StatusChangedEventHandler FileRead;
    public event StatusChangedEventHandler FileParsed;
    public event StatusChangedEventHandler FileSaved;

    public int DoOperation()    
    {    
        ReadTextFile();    
        ParsingData();    
        SaveTextFile();    
        return 0;    
    }    

    private int ReadTextFile()    
    {    
        //Read the text File
        OnFileRead(EventArgs.Empty);   
        return 0;
    }    

    private int ParsingData()    
    {    
        // Data manipulation
        OnFileParsed(EventArgs.Empty);
        return 0;       
    }    

    private int SaveTextFile()    
    {      
        // save the file
        OnFileSaved(EventArgs.Empty);
        return 0;    
    }

    protected virtual void OnFileRead(EventArgs e)
    {
        if(FileRead != null)
            FileRead(this, e);
    }

    protected virtual void OnFileParsed(EventArgs e)
    {
        if(FileParsed != null)
            FileParsed(this, e);
    }

    protected virtual void OnFileSaved(EventArgs e)
    {
        if(FileSaved != null)
            FileSaved(this, e);
    }
}

А затем ваша форма прослушивает эти события и соответствующим образом меняет свою метку:

public partial class Form1 : Form 
{ 
    private void button1_Click_1(object sender, EventArgs e) 
    { 
        class1 l_objClass1 = new class1();

        l_objClass1.FileRead += 
            delegate { lblStatus.Text = "File Read..."; };

        l_objClass1.FileParsed += 
            delegate { lblStatus.Text = "File Parsed..."; };

        l_objClass1.FileSaved += 
            delegate { lblStatus.Text = "File Saved..."; };

        l_objClass1.DoOperation(); 
    } 
} 
0 голосов
/ 23 июня 2010

Краткий ответ - да.Вы добавляете события в class1 и добавляете обработчики в Form1 с соответствующей логикой.Ниже приведен пример того, как это сделать

public partial class Form1 : Form
    {


        private void button1_Click_1(object sender, EventArgs e)
        {
            class1 obj = new class1();
            obj.FileReadingComplete += HandleFileReadingComplete;
            obj.DataManipulationComplete += HandleDataManipulationComplete;

            obj.DoOperation();

            obj.FileReadingComplete -= HandleFileReadingComplete;
            obj.DataManipulationComplete -= HandleDataManipulationComplete;

        }

        private void HandleFileReadingComplete(object sender, EventArgs args){ 
            //code here
        }

        private void HandleDataManipulationComplete(object sender, EventArgs args)
        {
            //code here
        }

    }


    public class class1
    {

        public event EventHandler FileReadingComplete;
        public event EventHandler DataManipulationComplete;

        public int DoOperation()
        {
            ReadTextFile();
        OnFileReadingComplete();
        ParsingData();
        OnDataManipulationComplete();
        SaveTextFile();
        return 0;
        }

        private int ReadTextFile()
        {
            //Read the text File
            return 0;

        }

        private int ParsingData()
        {
            // Data manipulation
            return 0;

        }

        private int SaveTextFile()
        {

            // save the file
            return 0;
        }

        public void OnFileReadingComplete()
        {
            EventHandler handler = FileReadingComplete;

            if (handler != null) {
                handler(this, EventArgs.Empty);
            }
        }

        public void OnDataManipulationComplete()
        {
            EventHandler handler = DataManipulationComplete;

            if (handler != null) {
                handler(this, EventArgs.Empty);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...