错误太长,无法输入标题。所以这就是它所说的:
错误1无法访问外部类型的非静态成员 ' WindowsFormsApplication3.Form1'通过嵌套类型 ' WindowsFormsApplication3.Form1.PCPrint' C:\用户\安德鲁\文档\ Visual 工作室 2010 \ Projects \ WindowsFormsApplication3 \ WindowsFormsApplication3 \ Form1.cs 407 39 WindowsFormsApplication3
我正在尝试打印我的表单,但是它没有识别文本框txtName.Text。为什么? 这是代码:
public class PCPrint : System.Drawing.Printing.PrintDocument
{
private Font _font;
private string _text;
private string TextToPrint
{
get { return _text; }
set { _text = value; }
}
public Font PrinterFont
{
get { return _font; }
set { _font = value; }
}
public PCPrint()
: base()
{
_text = string.Empty;
}
public PCPrint(string str)
: base()
{
_text = str;
}
protected override void OnBeginPrint(PrintEventArgs e)
{
base.OnBeginPrint(e);
if (_font == null)
{
_font = new Font("Times New Roman", 10);
}
}
protected override void OnPrintPage(PrintPageEventArgs e)
{
base.OnPrintPage(e);
int printHeight;
int printWidth;
int leftMargin;
int rightMargin;
Int32 lines;
Int32 chars;
{
printHeight = base.DefaultPageSettings.PaperSize.Height -
base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
printWidth = base.DefaultPageSettings.PaperSize.Width -
base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
leftMargin = base.DefaultPageSettings.Margins.Left;
rightMargin = base.DefaultPageSettings.Margins.Right;
}
if (base.DefaultPageSettings.Landscape)
{
int tmp;
tmp = printHeight;
printHeight = printWidth;
printWidth = tmp;
}
Int32 numLines = (int)printHeight / PrinterFont.Height;
RectangleF printArea = new RectangleF(leftMargin, rightMargin, printWidth, printHeight);
StringFormat format = new StringFormat(StringFormatFlags.LineLimit);
e.Graphics.MeasureString(_text.Substring(RemoveZeros(curChar)), PrinterFont, new SizeF(printWidth, printHeight), format, out chars, out lines);
e.Graphics.DrawString(_text.Substring(RemoveZeros(curChar)), PrinterFont, Brushes.Black, printArea, format);
curChar += chars;
if (curChar < _text.Length)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
curChar = 0;
}
}
public int RemoveZeros(int value)
{
switch (value)
{
case 0:
return 1;
default:
return value;
}
}
public void PrintDocument()
{
PCPrint printer = new PCPrint();
printer.PrinterFont = new Font("Verdana", 10);
printer.TextToPrint = txtName.Text; //ERROR IS HERE
printer.Print();
}
private void btnCreate_Click(object sender, EventArgs e)
{
PrintDocument();
}
}
}
}
答案 0 :(得分:2)
你有一个嵌套类:
public class PCPrint : System.Drawing.PrintDocument
在这个嵌套类中,您试图直接访问Form
txtName.Text
的成员,我假设它是一个文本框。
更重要的是,为什么要上课?把它放在另一个文件中。
其次,为什么PCPrint会成为自己的一个实例,而不是称它为自己的成员?
第三,PCPrint最好不要静态或singleton
如果在PrintDocument()
中调用该字符串,则可以将该字符串传递给Form
。
public void PrintDocument(string textName) { PrinterFont = new Font("Verdana", 10); TextToPrint = textName; // No longer trying to magically access field Print(); }
然后在您的表单中,将其连接到您的按钮事件处理程序。 (这三个中的一个取决于你决定在课堂上做什么)。
private void btn_click(object sender, EventArgs e) { PCPrint.PrintDocument(txtName.Text); // If static PCPrint printer = new PCPrint(); printer.PrintDocument(txtName.Text); // If not static PCPrint.GetInstance().PrintDocument(txtName.Text); // If singleton }
答案 1 :(得分:0)
txtName
似乎不是PCPrint
类的成员,但您将其视为一个。
即使PCPrint
在Form1
类中,它们仍然是不同的类,并且它们实例化为不同的对象。
至于问题的解决方案......我认为您需要重新考虑您的架构。
我认为你想让一个对象代表一个打印文档是有道理的,但它不应该直接与按钮点击事件交互。
相反,它应该从事件中创建和/或调用,您可以将textbox.text传递给构造函数或其他东西。