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