代码如下:
private void MainFrm_Load(object sender, EventArgs e)
{ //通过用户编号查询权限清单控制主窗体菜单使能状态
this.sendStrSQL = "select mnuBase,mnuEmployee,mnuBaseCharge,mnuOtherCharge,mnuDeductCharge";
sendStrSQL += ",mnuKaoqin,mnuDinner,mnuDorm,mnuRationHour,mnuInsurance,mnuWage,mnuAdd,mnuManage ";
sendStrSQL+="from hr_User where ID = '" + LoginFrm.strID + "'";
DataTable tempDataTable = link.SelectDataBase(sendStrSQL);
for (int i = 0; i < tempDataTable.Columns.Count; i++)
{
if (ushort.Parse(tempDataTable.Rows[0][i].ToString()) == 1)
{
string name = getFrmName(i);//取出相应的菜单项目name
Control control = this.Controls[name];
control.Enabled = true;
} }
}
红色为报错部分,错误显示为:未将对象引用设置到对象的实例
private void MainFrm_Load(object sender, EventArgs e)
{ //通过用户编号查询权限清单控制主窗体菜单使能状态
this.sendStrSQL = "select mnuBase,mnuEmployee,mnuBaseCharge,mnuOtherCharge,mnuDeductCharge";
sendStrSQL += ",mnuKaoqin,mnuDinner,mnuDorm,mnuRationHour,mnuInsurance,mnuWage,mnuAdd,mnuManage ";
sendStrSQL+="from hr_User where ID = '" + LoginFrm.strID + "'";
DataTable tempDataTable = link.SelectDataBase(sendStrSQL);
for (int i = 0; i < tempDataTable.Columns.Count; i++)
{
if (ushort.Parse(tempDataTable.Rows[0][i].ToString()) == 1)
{
string name = getFrmName(i);//取出相应的菜单项目name
Control control = this.Controls[name];
control.Enabled = true;
} }
}
红色为报错部分,错误显示为:未将对象引用设置到对象的实例
解决方案 »
- 请高手讲讲如何实现中文与英文的切换(winform)
- TabPage加一个pictureBox,然后,想在这个pictureBox上绘制图形,图形根据另外一个控件选择。怎么加?
- 求WpfPerf.exe 电脑上装了.net3.0SDK的朋友帮下忙
- c#中“\”把斜杠替换成"-"
- 性能还是性能,高性能socketC#原理及其实现.
- URI和URL的区别,谢谢!
- 怎样按照给定的字符串分割一个字符串
- 关于获取lastname的问题?有点难!
- 如何将Dataset中的字段值赋值NULL
- c# 有没有办法实现点击 但是不影响鼠标的操作
- 如何让input type="file"可以多选?
- 分别解释java和C#中值传递和引用传递
control.Enabled = true;
这一句 没有找到这个name的控件。
Control control = this.Controls[name];
if(control != null)
{
control.Enabled = true;
}
private string getFrmName(int titleCount)
{
switch (titleCount)
{
case 0:
return "mnuBase";
case 1:
return "mnuEmployee";
case 2:
return "mnuBaseCharge";
case 3:
return "mnuOtherCharge";
case 4:
return "mnuDeductCharge";
case 5:
return "mnuKaoqin";
case 6:
return "mnuDinner";
case 7:
return "mnuDorm";
case 8:
return "mnuRationHour";
case 9:
return "mnuInsurance";
case 10:
return "mnuWage";
case 11:
return "mnuAdd";
case 12:
return "mnuManage";
default:
return null;
}
}
在事件里面取的是菜单名称
你注意 design.cs里面的代码 每个控件new出来后 都有个Name属性
在design.cs页面中是有Name属性的,this.Controls[name]中的name是一个变量,是从getFrmName(int titleCount)过程的返回值,该过程我已经贴出来了。现在可能的原因是
Control control = this.Controls[name]没有取出值。
我的意思是把菜单的名称动态取出来,然后对它的Enabled属性赋值
this.Controls[name] 这个name参数是字符串 我知道是从getFrmName返回的 比方说你返回的是“mnuBase” 那么你是否生命了一个NAME为“mnuBase”的控件 并且把它添加到this.Controls中了呢?
你不妨调试一下 this.Controls 到底有哪些数据
if (ushort.Parse(tempDataTable.Rows[0][i].ToString()) == 1)
{
string name = getFrmName(i);//取出相应的菜单项目name
Control control = this.Controls[name];
control.Enabled = true;
} 这段代码,还是好好的去跟踪一下吧,看看这里的 this.Controls[name]是指什么,到底存不存在。
我估计是你自己的名字有差错,你仔细检查一下!
Control control = this.Controls[name];
if(control != null)
{
control.Enabled = true;
}
{
if (ushort.Parse(tempDataTable.Rows[0][i].ToString()) == 1)
{
try
{
string name = getFrmName(i);//取出相应的菜单项目name
Control control = this.Controls[name];
control.Enabled = true;
}
finally
{
continue;
}
} }
把错误忽略掉
for (int i = 0; i < tempDataTable.Columns.Count; i++)
{
if (ushort.Parse(tempDataTable.Rows[0][i].ToString()) == 1)
{
string name = getFrmName(i);//取出相应的菜单项目name
//Control control = this.Controls[name];
//control.Enabled = true;
Control [] ctls = this.Controls.Find(name,false);
if(ctls.Length > 0)
{
ctls[0].Enabled = true;
}
}
}
}
if(control != null)
{
control.Enabled = true;
}
判断后直接用
this.mnuBase.Enabled=ture;
ls的代码很可能是因为这个问题,而导致出现这个错误