【问题标题】:Cannot access a nonstatic member of outer type via nested type无法通过嵌套类型访问外部类型的非静态成员
【发布时间】:2015-04-04 08:24:13
【问题描述】:

此代码将在打印预览中添加保存工具提示,并将图片框保存为 PDF 格式。

 class SavePrint : System.Windows.Forms.PrintPreviewDialog
        {
            public SavePrint()
                : base()
            {
                if (this.Controls.ContainsKey("toolstrip1"))
                {

                    ToolStrip tStrip1 = (ToolStrip)this.Controls["toolstrip1"];
                    ToolStripButton button1 = new ToolStripButton();
                    button1.Text = "Save";

                    button1.Click += new EventHandler(SaveDocument);
                    button1.Visible = true;
                    tStrip1.Items.Add(button1);


                }
            }

            public void SaveDocument(object sender, EventArgs e)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Title = "Save As PDF";
                sfd.Filter = "PDF|*.pdf";
                sfd.InitialDirectory = @"Desktop";

                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    Bitmap bmp = new Bitmap(pictureBox.Image);//GETTING THE ERROR HERE
                    Graphics gr = Graphics.FromImage(bmp);

                    PdfDocument doc = new PdfDocument();
                    doc.Pages.Add(new PdfPage());
                    XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);

                    xgr.DrawImage(bmp, 0, 0);
                    doc.Save(sfd.FileName);
                    doc.Close();
                }
            }
        }

我在“Bitmap bmp = new Bitmap(pictureBox.Image)”这一行遇到错误我应该怎么做才能继承我的图片框?

【问题讨论】:

  • 您可能希望发布错误或异常详细信息,以便有人可以提供帮助。您可能需要检查 pictureBox.Image 是否为空。
  • pictureBox 是在哪里定义的?
  • 它位于公共部分类 Form1 中:Form
  • A nested class 不是子类。它是一个可以访问其容器类的私有成员的类,但在其他方面是独立的。要访问容器类的 instance 属性,请将容器传递给嵌套类的构造函数。
  • 我真的不知道,我是新手。

标签: c# save picturebox preview


【解决方案1】:

将您的类SavePrint 的构造函数更改为具有以下签名:

    class SavePrint : System.Windows.Forms.PrintPreviewDialog
    {
        readonly Form1 parent;
        public SavePrint(Form1 parent)
            : base()
        {
            this.parent = parent;

            // Remainder as before
        }
    }

然后,当您构造 SavePrint 时,将适当的实例 Form1 传递给构造函数。

            SavePrint savePrint = new SavePrint(this);

完成此操作后,您的 SavePrint 将能够访问其字段和属性:

            Bitmap bmp = new Bitmap(parent.pictureBox.Image);

顺便说一句,您应该将所有disposables 包装在using 语句中,如下所示:

            using (Bitmap bmp = new Bitmap(parent.pictureBox.Image))
            using (Graphics gr = Graphics.FromImage(bmp))
            {
            }

【讨论】:

  • @KevinRodriguez - 很高兴为您提供帮助。
  • 不包装会有什么影响?
  • @KevinRodriguez - 类持有的非托管资源(Windows 句柄、位图数据等)不会立即释放,这可能会导致内存不足问题,除非垃圾收集器启动很快。
  • 如果该类实现了IDisposable 接口,则应将其包装在using 语句中。大多数类没有,但是许多System.DrawingSystem.Windows.Forms 和文件相关的类有。 (例如,释放文件会关闭文件)如果您认为某个类可能是一次性的,请查看文档,或尝试将其放入 using 语句中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
相关资源
最近更新 更多