日期:2014-05-18  浏览次数:20930 次

赋值遭遇 "未将对象引用设置到对象的实例。"报错!
在C#的EXE窗体开发中,遇到一个问题,源代码如下:

  protected override void OnResize(EventArgs e)
  {
  this.panel2.Height = this.Height - 20; //扣除下面的按钮位置
  this.panel2.Width= this.Width-8; //左右留空

  for (int i = 1; i < 5; i++)
  {
  AxHBPlayCtrlLib.AxPBAV axPBAV = this.Controls["axPBAV" + i.ToString()] as AxHBPlayCtrlLib.AxPBAV;

axPBAV.Height = ((this.panel2.Height - 10) / 2);
axPBAV.Width = (this.panel2.Width - 10) / 2;

  if (i.Equals(1)) //A画面
  axPBAV.Location = new Point(5, 3);
  if (i.Equals(2)) //B画面
  axPBAV.Location = new Point(axPBAV.Width + 6, 3);
  if (i.Equals(3)) //C画面
  axPBAV.Location = new Point(5, axPBAV.Height + 4);
  if (i.Equals(4)) //D画面
  axPBAV.Location = new Point(axPBAV.Width +6, axPBAV.Height + 4);
  }
  }

上述代码中:功能是为了窗体尺寸调整时,四个图像控件axPBAV的大小能随标准控件panel2为标准控件。

运行时,红字报错:System.NullReferenceException {"未将对象引用设置到对象的实例。"}

不知何故? 寻求解决之道! C#菜鸟问题,请高手别见笑!!!



------解决方案--------------------
"未将对象引用设置到对象的实例"这类错误都是运行时才报的,编译时多数很难检测到这类错误,

AxHBPlayCtrlLib.AxPBAV axPBAV = this.Controls["axPBAV" + i.ToString()] as AxHBPlayCtrlLib.AxPBAV;

这句话,从窗体中查找名字为axPBAVx的控件,也许找不到,也许不是AxHBPlayCtrlLib.AxPBAV类型的,总之,这句话使axPBAV 等于null,

------解决方案--------------------
改成这样试试看:

AxHBPlayCtrlLib.AxPBAV axPBAV = panel2.Controls["axPBAV" + i.ToString()] as AxHBPlayCtrlLib.AxPBAV;

------解决方案--------------------
如果不行,你就检查一下名字axPBAVx是否对了,要不然就全部输出Controls中的控件名字,看看是不是有些线索,
------解决方案--------------------
窗体在Load时,如果窗体的大小不是默认的大小(好像是300*300),就会引发OnResize,而此时控件还没有加入到this.Controls里面,所以无法找到。

C# code

        public Form1()
        {
            InitializeComponent();

            this.Resize += Form1_Resize;
        }

        void Form1_Resize(object sender, EventArgs e)
        {
            //代码搬到这里
        }

------解决方案--------------------
你把这个窗体对应的 XXX.Designer.cs 文件贴上来看下
------解决方案--------------------
我觉得你这个函数本身就是重绘窗体,那个时候能够得到宽度、高度吗?试看
------解决方案--------------------
C# code

AxHBPlayCtrlLib.AxPBAV axPBAV = this.Controls["axPBAV" + i.ToString()] as AxHBPlayCtrlLib.AxPBAV

------解决方案--------------------
探讨
C# code


AxHBPlayCtrlLib.AxPBAV axPBAV = this.Controls["axPBAV" + i.ToString()] as AxHBPlayCtrlLib.AxPBAV


lz要注意as关键字,如果前面的对象为空,使用as关键字不会抛出异常,它会直接返回一个null,当你使用axPBAV.Height的属性时,由于axPBAV是空值,就会出……

------解决方案--------------------
1 可能原因:
1)添加的索引从0开始,就是axPBAV0,axPBAV1,...,这样到最后一个会报错。
2)添加的是0x,就是axPBAV01,axPBAV02,...,这样第一个就会报错。
3)添加到一个Panel里面,要使用this.Panel1.Controls["axPBAV" + i.ToString()] as ...
4)名字大小写不符。
5)“OnResize,而此时控件还没有加入到this.Controls里面,所以无法找到”
2 解决办法:
加判断条件
for (int i = 1; i < 5; i++)
{
AxHBPlayCtrlLib.AxPBAV axPBAV = this.Controls["axPBAV" + i.ToString()] as AxHBPlayCtrlLib.AxPBAV;