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

时间:2013-08-28 18:24:24

标签: c# winforms

错误太长,无法输入标题。所以这就是它所说的:

  

错误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();
            }
        }
    }
}

2 个答案:

答案 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类的成员,但您将其视为一个。

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


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

我认为你想让一个对象代表一个打印文档是有道理的,但它不应该直接与按钮点击事件交互。

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