bernova Ответов: 1

Как переопределить eventhander


Я переопределяю printpageeventhandler следующим образом :

public class MyPrintDoc : PrintDocument
    {
   
       
        protected void MyOnPrintPage(PrintPageEventArgs args)
        {
            PagePrintHandler(this, args, this.arr);
        }


и звоните как следует :

private void Create(string[] arr)
{
                MyPrintDoc PDoc = new MyPrintDoc(arr);
                if (iPrintCount > 0)
                {
            
}

private void PrintPagearr(object sender, PrintPageEventArgs ev, string[] arr)
{
...
}


но arr равен нулю при печати. как же ее решить.

Что я уже пробовал:

Я меняю делегат, но при печати arr[] ничего не печатаю.

1 Ответов

Рейтинг:
1

Sergey Alexandrovich Kryukov

Обработчик событий-это просто метод. Он становится обработчиком, когда вы добавляете его в список вызовов некоторого экземпляра события.

Поэтому понятие "переопределение" ничем не отличается от переопределения любого другого метода. Метод должен быть виртуальный и производный класс должен иметь достаточный доступ к нему; как правило,, protected используется модификатор доступа. Только тогда метод может быть переопределен.

В вашем примере кода я не вижу ключевых слов "virtual" или "abstract- следовательно, здесь нечего отменять. Чтобы изменить его, вам нужно сделать метод виртуальным,только тогда вы сможете переопределить его.

Если под "переопределением" вы на самом деле имели в виду что-то другое, пожалуйста, уточните; возможно, Я помогу Вам использовать правильный термин для того, что вам нужно, но в этом случае вы должны объяснить свои конечные цели.

[РЕДАКТИРОВАТЬ]

Например,

abstract class MyBaseForm : Form {
   internal MyBaseForm() {
      // ...
      Button.Click =+ ButtonClickHandler; 
   }
   Button Button = new Button;
   protected abstract ButtonClickHandler(object sender, EventArgs eventArgs);
}

// ...

class MyForm : MyBaseForm {
   protected override ButtonClickHandler(object sender, EventArgs eventArgs) {
       MessageBox("Do something");
   }
}

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

—СА


bernova

Я его меняю :
публичный класс MyPrintDoc : PrintDocument
{
public delegate void MyPrintPageEventHandler(Object sender, PrintPageEventArgs e, string[] arr);
публичное мероприятие MyPrintPageEventHandler PagePrintHandler;
частная строка[] arr;

public MyPrintDoc(string[] iarr)
{
это. arr = iarr;
}
общественные MyPrintDoc()
{ этот.iarr = null; }
защищенная пустота MyOnPrintPage(PrintPageEventArgs args)
{
PagePrintHandler(this, args, this.iarr);
}
}

Sergey Alexandrovich Kryukov

- Куда? Где виртуальное или абстрактное?
—СА

bernova

не могли бы вы привести пример ?
Большое спасибо