赋值遭遇 "
未将对象引用设置到对象的实例。"报错!
在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
------解决方案--------------------
------解决方案--------------------
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;