复制/粘贴图像时出现NullReferenceException

时间:2011-01-08 15:04:06

标签: c#

我通过实现这个简单的代码得到了一个错误。我不明白我在哪里做错了。

//错误

  

ImageCSharp.exe中发生了未处理的“System.NullReferenceException”类型异常   附加信息:Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt。

我可以获得剪贴板文字,但为什么我无法获取/设置图像。

// CODE

    public void copy()
    {
        // Determine the active child form.
        fImage activeChild = this.ActiveMdiChild as fImage;
        if (activeChild != null)
        {
            PictureBox mypicbox = activeChild.picbox;
            string win_name = activeChild.Tag.ToString();
            Clipboard.SetImage(mypicbox.Image);
            Clipboard.SetText(win_name);

        }
    }

    private void paste()
    {

       Image im=  Clipboard.GetImage();
       this.pictureBox1.Image = im;
       MessageBox.Show(im.Size.ToString());

    }

的问候,

2 个答案:

答案 0 :(得分:1)

不是您的问题的答案,但以下不会将图像和文本设置到剪贴板。即您的代码将文本设置为剪贴板

Clipboard.SetImage(mypicbox.Image);
Clipboard.SetText(win_name);

上面的代码试图将图像设置到剪贴板,然后是文本 即剪贴板将包含一个项目,根据您的代码是文本。

我假设因为paste中的代码要求图像在剪贴板中,所以MessageBox.Show(img.Size.ToString());上会抛出异常。

答案 1 :(得分:1)

  Clipboard.SetText(win_name);

将图像从剪贴板中转储出来,它只能容纳一个项目。删除该行以解决您的问题。并且防守代码:

    private void paste() {
        if (Clipboard.ContainsImage()) {
            Image im = Clipboard.GetImage();
            if (this.pictureBox1.Image != null) this.pictureBox1.Dispose();
            this.pictureBox1.Image = im;
        }
    }

要在剪贴板上获取两条信息,首先要声明一个小帮助程序类来存储此信息。例如:

    [Serializable]
    private class Clipdata {
        public Image Image { get; set; }
        public string Name { get; set; }
    }

    private void CopyButton_Click(object sender, EventArgs e) {
        var data = new Clipdata { Image = pictureBox1.Image, Name = textBox1.Text };
        Clipboard.SetDataObject(data);
    }
    private void PasteButton_Click(object sender, EventArgs e) {
        string fmt = typeof(Clipdata).FullName;
        if (Clipboard.ContainsData(fmt)) {
            var data = (Clipdata)Clipboard.GetDataObject().GetData(fmt);
            if (pictureBox1.Image != null) pictureBox1.Image.Dispose();
            pictureBox1.Image = data.Image;
            textBox1.Text = data.Name;
        }
    }