赋值遭遇 "未将对象引用设置到对象的实例。"报错!
在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;
if(axPBAV != null)
{axPBAV.Height = ((this.panel2.Height - 10) / 2);
axPBAV.Width = (this.panel2.Width - 10) / 2;
...
}
[解决办法]
http://www.cnblogs.com/cyq1162/archive/2011/07/24/2115388.html
这里有解决的办法 和你一样的错误
[解决办法]
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;
——这三行代码本身就是有问题的:
首先,你用 as 就表示 你的 axPBAV 可能为空;
但是你 axPBAV.Height 就表示 axPBAV 决不为空;
如果你的电脑安装了 ReSharper 插件,这个插件就会 警告你的代码有 逻辑不严密 的警告!!
————————————————————————————————————————
你要么这么写:
AxHBPlayCtrlLib.AxPBAV axPBAV = this.Controls["axPBAV" + i.ToString()] as AxHBPlayCtrlLib.AxPBAV;
if(axPBAV !=null)
{
axPBAV.Height = ((this.panel2.Height - 10) / 2);
axPBAV.Width = (this.panel2.Width - 10) / 2;
}
要么
AxHBPlayCtrlLib.AxPBAV axPBAV = (AxHBPlayCtrlLib.AxPBAV)this.Controls["axPBAV" + i.ToString()];
axPBAV.Height = ((this.panel2.Height - 10) / 2);
axPBAV.Width = (this.panel2.Width - 10) / 2;
这才是规范的且严谨的代码!
[解决办法]
试试14楼的
[解决办法]