-5

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

错误 1 ​​无法通过嵌套类型“WindowsFormsApplication3.Form1.PCPrint”访问外部类型“WindowsFormsApplication3.Form1”的非静态成员 C:\Users\Andrew\documents\visual studio 2010\Projects\WindowsFormsApplication3\WindowsFormsApplication3\Form1.cs 407 39 Windows窗体应用程序3

我正在尝试打印我的表单,但是它无法识别文本框 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();
            }
        }
    }
}
4

2 回答 2

2

你有一个嵌套类:

public class PCPrint : System.Drawing.PrintDocument

在这个嵌套类中,您试图直接访问 , 的成员FormtxtName.Text我假设它是一个文本框。

更重要的是,为什么要嵌套类?把它放在另一个文件中。

其次,为什么 PCPrint 自己创建一个实例而不是调用它自己的成员?

第三,PCPrint 最好是静态的或单例的

如果PrintDocument()Form.

公共无效打印文档(字符串文本名称)
{
  PrinterFont = new Font("Verdana", 10);
  TextToPrint = 文本名称;// 不再试图神奇地访问字段
  打印();
}

然后在您的表单中,将其连接到您的按钮事件处理程序。(根据你决定在课堂上做什么,做这三个中的一个)。

私人无效btn_click(对象发送者,EventArgs e)
{
  PCPrint.PrintDocument(txtName.Text); // 如果是静态的

  PCPrint 打印机 = new PCPrint();
  打印机.PrintDocument(txtName.Text); // 如果不是静态的

  PCPrint.GetInstance().PrintDocument(txtName.Text); // 如果是单例
}
于 2013-08-28T18:47:16.243 回答
0

txtName似乎不是该PCPrint班级的成员,但您将其视为班级成员。

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


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

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

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

于 2013-08-28T18:33:27.907 回答