Вызов события и ошибка "No overload for 'AddedTest' matches delegate 'System.EventHandler'" - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть фрагмент кода, спертый с иностранного форума:
        public void StartWatching(string PrinterDeviceName)
        {
            PrinterMonitorComponent mPr;
            mPr = new PrinterMonitorComponent();
            mPr.AddPrinter(PrinterDeviceName);
            
            mPr.JobAdded += AddedTest;
        }
 
        public void AddedTest(object sender, PrintJobEventArgs e)
        {
            string str = "";
            str += "Printer Name: " + e.PrintJob.PrinterName + Environment.NewLine;
            str += "User Name: " + e.PrintJob.UserName + Environment.NewLine;
            str += "Document Name: " + e.PrintJob.Document + Environment.NewLine;
            str += "Total Pages Printed: " + e.PrintJob.TotalPages + Environment.NewLine;
            str += "Date Time: " + e.PrintJob.Submitted + Environment.NewLine;
        }
Ругается на строку №7 "mPr.JobAdded += AddedTest;" с ошибкой "No overload for 'AddedTest' matches delegate 'System.EventHandler'" Я так понимаю, проблема в том, что

+=

вызывает стандартное событие с параметрами (object, EventArgs), а AddedTest работает с другими параметрами? Как можно вызвать событие и передать в него параметр типа PrintJobEventArgs? Спасибо.

Решение задачи: «Вызов события и ошибка "No overload for 'AddedTest' matches delegate 'System.EventHandler'"»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication4
{
    //Основная форма: класс-подписчик события
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Событие загрузки формы
            this.Load += delegate(object sender, EventArgs e)
            {
                //Создаем экземпляр класса
                MyClass mc = new MyClass();
                //Подписываемся на событие в этом экземпляре
                mc.myEvent += new EventHandler<MyEventArgs>(mc_myEvent);
                //Запускаем метод этого экземпляра в отдельном потоке
                Thread myThread = new Thread(new ThreadStart(mc.StartWork));
                myThread.IsBackground = true;
                myThread.Start();
            };
        }
        //Обработчик события, из аргумента события (MyEventArgs e) извлекается информация
        //И выводится на метку label на форме
        private void mc_myEvent(object sender, MyEventArgs e)
        {
            label1.Invoke((Action)delegate() { label1.Text = e.argsMessage.ToString(); });
            label1.Invoke((Action)delegate() { label1.Refresh(); });
        }
    }
    //Класс-издатель события
    public class MyClass
    {
        //public-событие обобщенного типа EventHandler<T>
        //где Т-наш тип класса-аргумента
        public event EventHandler<MyEventArgs> myEvent;
        //public-метод
        public void StartWork()
        {
            for (int i = 0; i < 1000; i++)
            {
                //Проверяем, есть ли подписчики на событие
                //Если есть, то генерируем событие с экземпляром класса-аргумента события
                if (myEvent != null)
                    myEvent(this, new MyEventArgs(i));
                Thread.Sleep(100);
            }
        }
    }
    //Класс аргумента события для класса-издателя
    public class MyEventArgs : EventArgs
    {
        //readonly переменная (значение устанавливается один раз в конструкторе)
        public readonly int argsMessage;
        //Конструктор класса
        public MyEventArgs(int args)
        {
            argsMessage = args;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы