无法通过嵌套类型Y访问外部类型X的非静态成员
本文关键字:类型 静态成员 外部 访问 嵌套类型 | 更新日期: 2023-09-27 18:29:34
错误太长,无法在标题中键入。这就是它所说的:
错误1无法访问外部类型的非静态成员"WindowsFormsApplication3.Form1"(通过嵌套类型)'WindowsFormsApplication3.Form1.PCPrint'C:''Users''Andrew''documents''visual演播室2010''Projects''WindowsFormsApplication3''WindowsFormsApplication3''Form1.cs 407 39 WindowsFormsAapplication3
我正在尝试打印我的表单,但它无法识别文本框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();
}
}
}
}
您有一个嵌套类:
public class PCPrint : System.Drawing.PrintDocument
在这个嵌套类中,您试图直接访问Form
、txtName.Text
的一个成员,我假设它是一个文本框。
更重要的是,为什么要嵌套类?把它放在另一个文件里。
其次,PCPrint为什么要创建自己的实例,而不是调用自己的成员?
第三,PCPrint最好是静态的或单一的
如果在Form
中调用该字符串,则可以将其传递给PrintDocument()
。
public void PrintDocument(字符串textName){PrinterFont=新字体("Verdana",10);TextToPrint=textName;//不再尝试神奇地访问字段打印();}
然后在表单中,将其连接到按钮事件处理程序。(根据你决定在课堂上做什么,做这三件事中的一件)。
private void btn_click(对象发送方,EventArgs e){PCPrint.PrintDocument(txtName.Text);//如果是静态的PCPrint printer=新PCPrint();打印机打印文档(txtName.Text);//如果不是静态的PCPrint.GetInstance().PrintDocument(txtName.Text);//如果单例}
txtName
似乎不是PCPrint
类的成员,但您将其视为一个。
即使PCPrint
在Form1
类中,它们仍然是不同的类,并且实例化为不同的对象。
至于你的问题的解决方案。。。我认为你需要重新思考你的架构。
我认为您希望一个对象表示打印文档是有道理的,但它不应该直接与按钮单击事件交互。
相反,它应该从事件中创建和/或调用,您可以将textbox.text传递给构造函数或其他东西。