Отправка аргументов через обработчик событий? - PullRequest
8 голосов
/ 11 февраля 2011

Так что я на самом деле не посылаю аргументы, а устанавливаю переменную класса на определенное значение, а затем снова использую ее в другом методе. Это лучший способ сделать что-то? Если нет, мне было бы интересно узнать правильный путь. Спасибо! Можно / нужно ли посылать аргументы другим способом?

private string PrintThis;

public void PrintIt(string input){
    PrintThis = input; //SETTING PrintThis HERE
    static private PrintDocument pd = new PrintDocument();
    pd.PrintPage += new PrintPageEventHandler(PrintDocument_PrintSomething);
    pd.Print();
}
private void PrintDocument_PrintSomething(Object sender, PrintPageEventArgs e) {
    e.Graphics.DrawString(PrintThis, new Font("Courier New", 12), Brushes.Black, 0, 0);
    //USING PrintThis IN THE ABOVE LINE
}

Ответы [ 3 ]

10 голосов
/ 11 февраля 2011

Замыкания были введены в язык для решения этой самой проблемы.

Захватив соответствующую переменную, вы можете предоставить ей хранилище, которое «переживает» содержащий метод:

// Note that the 'input' variable is captured by the lambda.
pd.PrintPage += (sender, e) => Print(e.Graphics, input);
...

static void Print(Graphics g, string input) { ... }

Обратите внимание, что это очень удобная функция;То, как компилятор решает эту проблему от вашего имени, подозрительно похоже на ваше собственное существующее решение.(Существуют определенные различия, например, захваченная переменная заканчивается как поле вновь созданного объекта некоторого другого (сгенерированного) класса. Ваше существующее решение не делает этого: у вас есть one «временное» хранилище для экземпляра вашего класса, а не для вызова на PrintIt, что нехорошо - например, не поточно-ориентировано)

1 голос
/ 11 февраля 2011

Не обычно, но для этого API (печать WinForms) это обычный подход.

Учтите, что PrintThis - это не просто переменная, а ваша "модель" или "документ".

0 голосов
/ 11 февраля 2011

В качестве альтернативы вы можете использовать наследование:

class MyPrintDocument : PrintDocument
{
  public delegate void MyPrintPageEventHandler (object, PrintPageEventArgs, object); // added context!
  public event MyPrintPageEventHandler MyPrintPageEvent;

  public MyPrintDocument (object context) { m_context = context; }
  protected void OnPrintPage (PrintPageEventArgs args)
  {
    // raise my version of PrintPageEventHandler with added m_context
    MyPrintPageEvent (this, args, m_context);
  }
  object m_context;
}

public void PrintIt(string input)
{
  MyPrintDocument pd = new MyPrintDocument(input);
  pd.MyPrintPage += new MyPrintPageEventHandler (PrintDocument_PrintSomething);
  pd.Print();
}

private void PrintDocument_PrintSomething(Object sender, PrintPageEventArgs e, object context)
{
   e.Graphics.DrawString((string) context, new Font("Courier New", 12), Brushes.Black, 0, 0);
}
...