我在尝试打开/显示新表单时有时会收到 ArgumentException 参数无效,为啥?

Posted

技术标签:

【中文标题】我在尝试打开/显示新表单时有时会收到 ArgumentException 参数无效,为啥?【英文标题】:I'm getting ArgumentException parameter is not valid sometimes when trying to open/show a new form why?我在尝试打开/显示新表单时有时会收到 ArgumentException 参数无效,为什么? 【发布时间】:2014-06-28 03:22:49 【问题描述】:

我在Form1 一个pictureBox1 和一个双击事件:

private void pictureBox1_DoubleClick_1(object sender, EventArgs e)

    pb1_fs = new Picturebox1_Fullscreen();
    pictureBox1.Enabled = true;
    g = last_image_file();
    nf = sf + @"\radar" + g.ToString("D6") + ".gif";
    lf = nf;
    pb1_fs.WindowState = FormWindowState.Maximized;
    pb1_fs.Show();
    pb1_fs.picturebox1(pictureBox1);
    pb1_fs.FormClosing += new FormClosingEventHandler(pb1_fs_FormClosing);

这应该会打开/显示新表单pb1_fs

我没有像现在这样的问题。

问题是一旦我双击pictureBox1,有时它会发生,有时我没有得到

ArgumentException 参数无效。

而且我不确定问题出在哪里,因为它停止并抛出异常的行在Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Diagnostics;

namespace mws

    static class Program
    
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        
            if (IsApplicationAlreadyRunning() == true)
            
                MessageBox.Show("The application is already running");
            
            else
            
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            
        

        static bool IsApplicationAlreadyRunning()
        
            string proc = Process.GetCurrentProcess().ProcessName;
            Process[] processes = Process.GetProcessesByName(proc);

            if (processes.Length > 1)
            
                return true;
            
            else
            
                return false;
            
        
    

它停止并在上显示异常

第二次 关闭。

      Application.Run(new Form1());
   

异常完整消息是:

System.ArgumentException 未处理 HResult=-2147024809 消息=参数无效。 来源=System.Drawing 堆栈跟踪: 在 System.Drawing.Image.get_RawFormat() 在 System.Drawing.Graphics.DrawImage(图像图像,Int32 x,Int32 y,Int32 宽度,Int32 高度) 在 System.Drawing.Graphics.DrawImage(Image image, Rectangle rect) 在 System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe) 在 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,Int16 层) 在 System.Windows.Forms.Control.WmPaint(消息&m) 在 System.Windows.Forms.Control.WndProc(Message&m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

问题是什么导致了异常,如果在 form1 上的双击事件中,在哪里?或者也许是新形式的 pb1_fs 构造函数?如何检查问题出在哪里?

我也可以在这里添加 pb1_fs 形式的构造函数代码,但它很长。

编辑:

这是新表单中的方法picturebox1。 在 Form1 中的行:

pb1_fs.picturebox1(pictureBox1);

将 pictureBox1 从 Form1 传递到新表单,以便在新表单中我可以使用并显示 form1 pictureBox1 中的当前图像。

public PictureBox picturebox1(PictureBox pb1)

    pictureBox1.Image = pb1.Image;
    return pictureBox1;

【问题讨论】:

我现在添加了 try and catch,但它并没有在 catch 处停止,而是立即跳到 Program.cs 并在异常情况下停在那里。也许问题出在新形式的 pb1_fs 构造函数代码中?而不是在双击事件中? 您的问题出在 Form1 的构造函数中,可能是您的代码,也可能是设计文件。在那里进行调试。 你能解释一下这行是什么吗:pb1_fs.picturebox1(pictureBox1); 史蒂夫更新了我的问题,现在解释了该行的使用:pb1_fs.picturebox1(pictureBox1);使用新形式的方法代码。 【参考方案1】:

我不知道错误是什么,但会尝试移动这条线

pb1_fs.Show();

所有其他初始化代码之后。

【讨论】:

pb1_fs.Show();显示新表格。如果我删除它并双击没有任何反应。 不要删除它,只需将它放在其他涉及 pb1_fs 变量的代码之后。【参考方案2】:

我认为问题出在这里:

public PictureBox picturebox1(PictureBox pb1)

  pictureBox1.Image = pb1.Image;
  return pictureBox1;

我认为您需要复制该图像,因此您不会在 2 个不同的 UI 元素中使用该图像的一个实例。将代码替换为:

public PictureBox picturebox1(PictureBox pb1)

  pictureBox1.Image = pb1.Image.Clone();
  return pictureBox1;

我还将 Show() 方法移到下面:

pb1_fs.FormClosing += new FormClosingEventHandler(pb1_fs_FormClosing);

这一行

【讨论】:

以上是关于我在尝试打开/显示新表单时有时会收到 ArgumentException 参数无效,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

SHOWMODALDIALOG表单提交时禁止打开新窗口

如何防止新的 WPF 表单窃取焦点?

我在提交表单时遇到错误

我在提交表单时遇到错误

检测外键冲突

尝试打开新的浏览器窗口时如何避免 Javascript 超时异常?