Обработчик событий C # между объектами - PullRequest
0 голосов
/ 21 марта 2011

Я все еще изучаю, как использовать События в C #, поэтому я придумаю, что должно быть довольно простым практическим примером. У меня есть объект, который читает из базы данных в список. Когда элемент в базе данных удаляется, запускается событие. Как заставить объект DBWrapper прослушивать событие, инициированное другим классом?

public class DBWrapper
{
    private List<DBStruct>  _List;

    public List<DBStruct> GetList
    {
         get
         {
              return _List;
         }
    }

    void OnDeleted(object sender, EventArgs e)
    {
         //Re-read the list from db.  I could probably do
         //something with Lazy<T> loading to eliminate the event stuff
         //but that's not the point.
         _List = (from d in db select d).ToList();
    }
}

Затем у меня есть другой класс с методом Delete (), который вызывает событие:

public class DeleteDB
{
     public void Delete(int index)
     {
          //delete from db where d.ID = index

          //fire deletion event to a DBWrapper object
     }
}

По сути, я хочу, чтобы мой вывод был таким:

void Test()
{
    DBWrapper dbw = new DBWrapper();

    Console.WriteLine(dbw.GetList);
    //Apple=1,Banana=2,Cake=3

   DeleteDB ddb = new DeleteDB();
   ddb.Delete(1);

   Console.WriteLine(dbw.GetList);
   //Banana=2,Cake=3
}

Как заставить один объект прослушивать событие, вызванное другим объектом?

1 Ответ

0 голосов
/ 21 марта 2011

Вы подключаете обработчик события в DbWrapper к событию на DeleteDB. Вот некоторый код, чтобы объяснить, используя то, что вы предоставили.

public class DeleteEventArgs:EventArgs{
    public DeleteEventArgs(int index){
        _index = index;
    }
    private readonly int _index;
    public int Index{get{return _index;}}
}

public class DeleteDB
{
     public event EventHandler<DeleteEventArgs> Deleted;

     public void Delete(int index)
     {
            if(Deleted!=null)  {
                  Deleted(this,new DeletedEventArgs(index));
            }
      }
 }

  void Test()
  {
      DBWrapper dbw = new DBWrapper();
      Console.WriteLine(dbw.GetList);
      //Apple=1,Banana=2,Cake=3

      DeleteDB ddb = new DeleteDB();
      ddb.Deleted += dbw.OnDeleted;            

      ddb.Delete(1);

      Console.WriteLine(dbw.GetList);
      //Banana=2,Cake=3
   }

Обратите внимание, что ваш OnDeleted метод DBWrapper должен быть открыт для его назначения, если только метод Test() не входит в класс DBWrapper.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...