通业开发人论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 358|回复: 2

error:未将对象引用设置到对象的实例

[复制链接]
发表于 2014-4-19 12:28:28 | 显示全部楼层 |阅读模式
当项目从VS2008版本迁移至VS2012时出现该问题.
该错误并不影响程序的编译与执行.但任意设计视图均无法打开.
现象及处理办法如下:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

相关帖子

回复

使用道具 举报

 楼主| 发表于 2014-4-19 12:32:16 | 显示全部楼层
C#中打开设计视图时报"未将对象引用设置到对象的实例" 通常情况下,若是你将用户控件写好了放入窗体中,若是有不合理的代码,则会弹出错误提示框,不让你放。若是你之前只是随便加了一个用户控件,并且没有什么问题,但后来你又把控件改坏掉了,那么你打开就会报错(在窗体内显示错误,选择"忽略并继续"还是可以打开设计界面的)。



一般在设计时打开设计视图报"未将对象引用设置到对象的实例",基本上都是你在用户控件的构造方法及Form Load事件中写入了计算的代码。如以下代码放入到别的控件中就会报错:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CommonControls
{
    public partial class ucAddUser : UserControl
    {
        public ucAddUser()
        {
            InitializeComponent();
        }

        public UserInfo userInfo
        {
            get;
            set;
        }

        private void ucAddUser_Load(object sender, EventArgs e)
        {
            //加载的时候就显示这个值
            this.textBox1.Text = userInfo.UserName;
            this.textBox2.Text = userInfo.UserTel;
        }
    }
}

此界面自己打开来是不会有问题的,但若是放入其它窗体中就会报错。因为自己加载时不会加载_Load事件,但若是你放入其它控件中,在加载控件时,会加载_Load事件,而我们的userInfo又没有赋值,故在_Load做this.textBox1.Text = userInfo.UserName;的时候就会报错,因为userInfo为空。



一般不要在用户控件的构造方法及Form Load事件中写入计算的代码

若是非要这样做,也是可以解决的:

private void ucAddUser_Load(object sender, EventArgs e)
{
    if (DesignMode)
        return;

    if (string.Compare(System.Diagnostics.Process.GetCurrentProcess().ProcessName, "devenv") == 0)
    {
        return;
    }

    //加载的时候就显示这个值
    this.textBox1.Text = userInfo.UserName;
    this.textBox2.Text = userInfo.UserTel;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-19 12:33:20 | 显示全部楼层
加载设计器错误——未将对象引用设置到对象的实例 在coding的时候又遇到了加载设计器错误,碰到这个问题总是束手无策,往往不知问题出在哪,千辛万苦找到了问题所在又不懂如何解决。

http://msdn.microsoft.com/zh-cn/library/ms171843(VS.80).aspx 这个地方列举了在设计阶段的开发过程中遇到的故障,我的问题定位在以意外的方式引发了设计器事件

如果您的自定义设计器将事件处理程序附加到设计器事件,如 ComponentRemovedActiveDesignerChanged 和 SelectionChanged,您必须在您的设计器的 Dispose 方法中分离您的事件处理程序。

如果不这样做,则可能导致在运行时出现意外行为。下面列出了可能会出现的一些症状:

错误信息框:“处理此命令时出错。”

错误信息框:“未将对象引用设置到对象的实例。”

删除组件或关闭设计器时未正确调用事件处理程序。

我想问题是这样的,我自己定义了一个usercontrol,这个usercontrol上有很多控件,然后我新建了一个窗口,将这个usercontrol拖到窗口上,到此一切安好,但是当我在usercontrol的load事件中添加了处理函数后,就会蹦出设计器加载错误的提示了。因此触发了错误“如果您的自定义设计器将事件处理程序附加到设计器事件”而没有在您的设计器的 Dispose 方法中分离您的事件处理程序。

我想usercontrol相对于窗口来说是一个独立的Component,因此窗口在dispose这个usercontrol时,却碰到了这个usercontrol已经发生了事件处理方法,用不太准确的话说这个usercontrol里的各个控件被激活了,窗口的dispose方法只懂得处理未被激活的usercontrol,当usercontrol添加了事件处理方法它就无能为力所以就报错了。我的这个想法可能不对,但自己这么理解的话还能说得过去吧。

然后我确实不知道怎么在您的设计器的 Dispose 方法中分离您的事件处理程序,csdn上有个人提出了一个很好的解决方案,把load事件中的处理方法放在一个if语句里,如下

private void UCIdcBaseInfo_Load(object sender, EventArgs e)
        {
             if (!DesignMode)
            {
                this.AddDataSourceToCmbBox();
            }

        }

也就是说在设计模式时不加载这些处理方法,所以就不会报错了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|TongYe R&D Inc.

GMT+8, 2024-4-28 21:49 , Processed in 0.127007 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2000-2022, Tongye. 粤ICP备17061194号

快速回复 返回顶部 返回列表