我在尝试打开/显示新表单时有时会收到 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 参数无效,为啥?的主要内容,如果未能解决你的问题,请参考以下文章