主方法中的参数异常(winforms)

时间:2011-04-14 14:31:28

标签: c# winforms argumentexception

     static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new SpaceInvaders());// i get an error here when i start the form application.. it says Argument Exception. Parameter is not valid
    }

我的主要表格看起来像这样:

    public SpaceInvaders()
    {
        InitializeComponent();

    }

    public void SpaceInvaders_Load(object sender, EventArgs e)
    {
}

这里是堆栈跟踪

  

“在System.Drawing.Graphics.GetHdc()\ r \ n的System.Drawing.BufferedGraphics.RenderInternal(HandleRef refTargetDC,BufferedGraphics buffer)\ r \ n在System.Drawing.BufferedGraphics.Render()\ r \在系统.Windows.Forms.Control.WmPain(Message& m)\ r \ n的System.Windows.Forms.Control.WndProc(Message& m)\ r \ n在System.Windows.Forms.ScrollableControl.WndProc上System.Windows上System.Windows.Forms.Form.WndProc(Message& m)\ r \ n的System.Windows.Forms.ContainerControl.WndProc(Message& m)\ r \ n的消息& m)\ r \ n系统.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr在System.Windows.Forms.Application.Component.System.Windows.Forms上的System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)\ r \ n中的hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)\ r \ n .UnsafeNativeMethods.IMsoComponentM在System.Windows.Forms.Application.ThreadContext的System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,ApplicationContext context)\ r \ n中的anager.FPushMessageLoop(Int32 dwComponentID,Int32 reason,Int32 pvLoopData)\ r \ n .RunMessageLoop(Int32 reason,ApplicationContext context)\ r \ n在System.Windows.Forms.Application.Run(Form mainForm)\ r \ n,位于D:\ Documents and Settings \ Dima \ My中的WindowsFormsApplication1.Program.Main() Documents \ Visual Studio 2008 \ Projects \ SpaceInvaders \ SpaceInvaders \ Program.cs:第18行\ r \ n在System.AppDomain._nExecuteAssembly(程序集,String [] args)\ r \ n在System.AppDomain.ExecuteAssembly(String assemblyFile) ,证据assemblySecurity,String [] args)\ r \ n在System.Threading上的System.Threading.ThreadHelper.ThreadStart_Context(对象状态)\ r \ n的Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()\ r \ n中。 ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)\ r \ na t System.Threading.ThreadHelper.ThreadStart()“

“参数无效。”

我想我发现了问题:

  public void Draw(Graphics  g,int animationCell)
    {
     // some code
        g.dispose()//that method threw the exception can someone tell me why? i thought you do need to dispose your graphics object at the end when you finish using it.
       }

3 个答案:

答案 0 :(得分:2)

我认为您应该使用Step Into(F11)进行调试,以便您可以进入SpaceInvaders表单并查看是否有任何null或其他无效参数提供给方法。

此行可能不会立即抛出异常:

Application.Run(new SpaceInvaders());

但是一些初始化函数可能会产生问题。

看到堆栈跟踪和代码后进行编辑:

请参阅//some code部分。检查g.dispose()之前的代码是否不会触发在Draw方法之后执行的任何事件处理程序。如果是这样,那么该事件处理程序应该是需要图形对象的处理程序,但是你已经将它处理掉了。因此,图形参数为空。如果您需要任何进一步的帮助,请填写//some code部分。

答案 1 :(得分:1)

简短回答:

只是不要在Draw() - methode中的Graphics-object上调用Dispose()。 Graphics-object包含本机绘图表面的句柄。如果您丢弃它,您的表格将无法在屏幕上绘制。

答案 2 :(得分:1)

你不应该丢弃别人的Graphics对象。

只处理您拥有的对象,并且只有当您确定没有其他人将使用它时。

如果你从别人那里得到一次性物品,你应该假设(除非他们另有说明)他们会在你完成后处理它。你不应该自己处理它,你不应该保存它以后(因为他们可能已经处理它)