【问题标题】:NullReferenceException in copy/ paste of image图像复制/粘贴中的 NullReferenceException
【发布时间】:2011-01-09 01:11:56
【问题描述】:

我在执行这个简单的代码时遇到了错误。我不明白我在哪里做错了。

// 错误

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

我可以获取剪贴板文本,但为什么我无法获取 /set 图像。

//代码

    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());

    }

问候,

【问题讨论】:

  • 哪一行抛出异常?

标签: c#


【解决方案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;
        }
    }

【讨论】:

  • thanx.you 是对的。但这正是我遇到问题的地方。我需要图像以及 win_name。我怎么会有这个??? (请回答谢谢)
  • @sayyad - 帖子已更新。请注意,您将无法粘贴到其他应用中。
【解决方案2】:

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

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

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

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

【讨论】:

  • 首先谢谢。你和汉斯是对的。但这正是我遇到问题的地方。我需要图像以及 win_name。我怎么会有这个??? (请回答谢谢)
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 2010-12-03
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多