C# WinForm 登录后设置按钮可见性及权限判断条件被跳过问题
实现登录后修改主窗体按钮可见性的解决方案
基础逻辑修复
你之前用静态方法UserAutherised实现权限判断的思路存在问题:静态方法无法直接操作当前正在运行的主窗体实例的控件属性,你后续采用事件回调的方向是正确的,可按照以下逻辑调整代码:
- 在
MainMenu窗体中定义私有字段存储当前用户权限状态,避免重复查询:// 存储当前登录用户的权限 private string _currentUserAccess; - 简化
MainLogin中事件触发的代码,使用空条件运算符规避空引用异常,和你原有判断逻辑完全等效:// 替换原有if-else判断事件是否为空的代码 ACCESS?.Invoke(userAccess.Trim()); POSITION?.Invoke(userPosition.Trim()); - 在
MainMenu的权限回调方法中直接执行按钮显隐逻辑,不需要额外调用方法查询权限状态:private void UserAccess(string access) { _currentUserAccess = access; // 显示对应权限的按钮 ShowButtons(); // 隐藏登录按钮 btnLogin.Visible = false; // 移除Panel中的登录控件 panel_Main.Controls.Clear(); } - 实现
ShowButtons方法根据权限设置按钮可见性:private void ShowButtons() { switch(_currentUserAccess) { case "yellow": // 管理员权限显示所有功能按钮 btnUserManagement.Visible = true; btnDataManagement.Visible = true; btnNormalOperation.Visible = true; break; case "green": // 普通用户仅显示基础操作按钮 btnNormalOperation.Visible = true; break; default: // 无权限不显示任何功能按钮 break; } }
条件判断不生效问题说明
你找到的根因是正确的:SQL Server中nchar为定长字符串类型,如果字段定义长度大于实际存储的字符串长度,会自动在字符串末尾补空格填充,导致你拿到的实际值为"yellow ",和代码中case "yellow"的字符串无法完全匹配,所以判断逻辑会直接进入default分支。
除了将字段类型修改为varchar/nvarchar变长字符串类型外,也可以在拿到数据库返回的字符串后调用Trim()方法移除首尾空白字符,就算后续字段类型变更也能兼容,稳定性更高。
其他可优化点
- 你贴出的SQL查询语句存在语法错误,
SELECT, Access需要修改为SELECT position, Access - 代码中创建的SqlCommand对象名为
cmd_get_position_Access,但后续添加参数时使用的是cmd变量,变量名不统一会导致运行时报错 - 登录验证完成后记得及时关闭DataReader和数据库连接,避免资源泄漏
内容的提问来源于stack exchange,提问作者Archon356
相关产品推荐
相关产品推荐

