无法通过嵌套类型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();
            }
        }
    }
}

无法通过嵌套类型Y访问外部类型X的非静态成员

您有一个嵌套类:

public class PCPrint : System.Drawing.PrintDocument

在这个嵌套类中,您试图直接访问FormtxtName.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类的成员,但您将其视为一个。

即使PCPrintForm1类中,它们仍然是不同的类,并且实例化为不同的对象。


至于你的问题的解决方案。。。我认为你需要重新思考你的架构。

我认为您希望一个对象表示打印文档是有道理的,但它不应该直接与按钮单击事件交互。

相反,它应该从事件中创建和/或调用,您可以将textbox.text传递给构造函数或其他东西。