c#里menustrip控件 的菜单模块的属性修改问题(代码实现)
MenuStrip菜单下有好几个模块,我想用代码对各个模块的Enable实现false和true的控制从而实现对模块的锁定和解锁,比如有个(权限)模块我写权限ToolMe...
MenuStrip菜单下有好几个模块,我想用代码对各个模块的Enable实现false和true的控制从而实现对模块的锁定和解锁,比如有个 (权限)模块 我写 权限ToolMenuStrip.Enabled=true; 却不能实现。要怎么实现求大手指教 谢谢!
展开
3个回答
展开全部
应该是可以实现的,一般情况下只要你能找到正确的Item,设置是可以实现的,但是在VS以前的版本中确实也会存在类似的问题,这种问题的原因是重绘导致的。按理说现在不会再出现 了。
我们知道,如果你的设置在菜单重绘之前,那么根据你设定的参数,会绘制你灰色或是可激活的两种情况的,但如果你的代码是发生在重绘之后,也就是说菜单重绘之后你才设定新值,而设定后并没有再对菜单进行重缓,那么这个菜单肯定会维持原来的绘制结果,并不能发生改变。
而且,你的改变只是改变了绘制中的enabled,而清除或是在其功能上做出相应的限制,所以还是能够引发事件的。举一个例子,你一个按钮一个菜单项,绑定的是同一个事件,即使你其中一个被禁用了,那么另一个还是可以被单击引发的。换句话来说,通过enabled只是隐藏了绑定事件,并不是真正地做出了权限配置!通过源码或是其他的方式,按样可以被完整的调用(事实其实也只是一个方法而已,无法sender中标注了事件源,如果该事件源被禁用,只是事件源中的一个属性被改变,并不能阻止调用)。
换句话来说,一般情况下我们在写事件时也会用,防止被调用:
if(sender == null) return;
// 如果没有事件源则不执行其他动作。
if(!(sender as control).Enabled) return;
// 如果事件源的enabled属性被置为false,则不执行。
这种情况下,即使重绘失效(也就是说你设定了false,但因为控件没有重绘仍然是可点击状态),点击后获得到false的值,也不会执行,两条语句就是以策安全。
至于重绘失效,我怀疑你要么是以前的版本(汗的是我也忘记了哪个版本了),要么是找错control了。
我们知道,如果你的设置在菜单重绘之前,那么根据你设定的参数,会绘制你灰色或是可激活的两种情况的,但如果你的代码是发生在重绘之后,也就是说菜单重绘之后你才设定新值,而设定后并没有再对菜单进行重缓,那么这个菜单肯定会维持原来的绘制结果,并不能发生改变。
而且,你的改变只是改变了绘制中的enabled,而清除或是在其功能上做出相应的限制,所以还是能够引发事件的。举一个例子,你一个按钮一个菜单项,绑定的是同一个事件,即使你其中一个被禁用了,那么另一个还是可以被单击引发的。换句话来说,通过enabled只是隐藏了绑定事件,并不是真正地做出了权限配置!通过源码或是其他的方式,按样可以被完整的调用(事实其实也只是一个方法而已,无法sender中标注了事件源,如果该事件源被禁用,只是事件源中的一个属性被改变,并不能阻止调用)。
换句话来说,一般情况下我们在写事件时也会用,防止被调用:
if(sender == null) return;
// 如果没有事件源则不执行其他动作。
if(!(sender as control).Enabled) return;
// 如果事件源的enabled属性被置为false,则不执行。
这种情况下,即使重绘失效(也就是说你设定了false,但因为控件没有重绘仍然是可点击状态),点击后获得到false的值,也不会执行,两条语句就是以策安全。
至于重绘失效,我怀疑你要么是以前的版本(汗的是我也忘记了哪个版本了),要么是找错control了。
展开全部
false才是禁用,true是启用
追问
我的意思是这样写会报错写false true都一样 求正确的写法
追答
报错?所以你为什么不把报错的信息发出来?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
menustrip[“更改密码”]
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询