none
linkLabel 在某种情况下出现参数无效? 是bug吗? RRS feed

  • 问题

  • 在winform窗体开发中.单例一个窗体.在窗体form2.show()之后.在点击form2.ShowDialog();

    form2中的linkLabel1 抛出异常. “System.ArgumentException”类型的未经处理的异常在 System.Drawing.dll 中发生 

    //Form1 窗体代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f = Form2.GetInstance();
                f.Show();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                Form2 f = Form2.GetInstance();
                f.ShowDialog();
            }
        }
    }
    


    Form2代码:

    //Form2代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            private static  Form2 f = null;
            public static Form2 GetInstance()
            {
                if(f==null ||  f.IsDisposed )
                {
                    f = new Form2();
                }
                if(f.Visible)
                {
                    f.Visible = false;
                }
                return f;
            }
            private Form2()
            {
                InitializeComponent();
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                LinkLabel.Link lk = new LinkLabel.Link();
                lk.LinkData = "http://msdn.microsoft.com/zh-CN/";
                linkLabel1.Links.Add(lk);
            }
        }
    }
    

    先点击show,再点击ShowDialog

    抛出异常:

       在 System.Drawing.Graphics.ExcludeClip(Region region)
       在 System.Windows.Forms.LinkLabel.OnPaint(PaintEventArgs e)
       在 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
       在 System.Windows.Forms.Control.WmPaint(Message& m)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 System.Windows.Forms.Label.WndProc(Message& m)
       在 System.Windows.Forms.LinkLabel.WndProc(Message& msg)
       在 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)
       在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.RunDialog(Form form)
       在 System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
       在 System.Windows.Forms.Form.ShowDialog()
       在 WindowsFormsApplication1.Form1.button2_Click(Object sender, EventArgs e) 位置 c:\Users\Y\Documents\Visual Studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行号 28
       在 System.Windows.Forms.Control.OnClick(EventArgs e)
       在 System.Windows.Forms.Button.OnClick(EventArgs e)
       在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
       在 System.Windows.Forms.Button.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)
       在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.Run(Form mainForm)
       在 WindowsFormsApplication1.Program.Main() 位置 c:\Users\Y\Documents\Visual Studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs:行号 18
       在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       在 System.Threading.ThreadHelper.ThreadStart()

    为什么使用label不会出现该问题?而使用linkLabel 会出现这个问题? 

    thanks

    祝工作顺利!

    环境:vs2013,vs2010; .NET Framework 4


    2014年4月27日 15:31

答案

  • 你好:

    我根据你的代码作了简单的测试,确实会出现异常,而且从异常信息很难判断出来问题出现在哪里,很有可能是一个BUG,我建议你在Microsoft Connect上提交一个BUG,会有微软的工程师给你解决方案。

    另外对Form实现单例模式的时候,最好在Designer.cs中重写的Dispose方法中将静态的实例置空:

    protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
                f = null;
            }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月29日 6:40
    版主

全部回复

  • 发不了图片,界面上面很简单..form2窗体上面添加一个LinkLabel 
    2014年4月27日 15:32
  • 你好:

    我根据你的代码作了简单的测试,确实会出现异常,而且从异常信息很难判断出来问题出现在哪里,很有可能是一个BUG,我建议你在Microsoft Connect上提交一个BUG,会有微软的工程师给你解决方案。

    另外对Form实现单例模式的时候,最好在Designer.cs中重写的Dispose方法中将静态的实例置空:

    protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
                f = null;
            }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月29日 6:40
    版主