所以我实际上并没有发送参数,而是将类变量设置为某个值,然后在另一个方法中再次使用它。这是做事的“最佳实践”方式吗?如果没有,我有兴趣学习正确的方法。谢谢!可以/应该以其他方式发送参数吗?
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
}
答案 0 :(得分:10)
通过捕获适当的变量,您可以为其提供“超出”包含方法的存储:
// 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) { ... }
请注意这是一个非常便利的功能;编译器代表您解决此问题的方式与您自己的现有解决方案非常相似。 (存在一些差异,例如捕获的变量最终作为某些其他(生成)类的新创建对象的字段。您现有的解决方案不会这样做:您有一个< / em>您的类的实例的“临时”存储位置,而不是每次调用到PrintIt
,这不是好事 - 它不是线程安全的,例如)
答案 1 :(得分:1)
不正常,但对于此API(WinForms打印),这是通常的方法。
考虑到PrintThis不仅仅是一个变量,而是你的“模型”或“文档”。
答案 2 :(得分:0)
或者,您可以使用继承:
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);
}