用户等级显示不同窗体

判断思路:

1.判断有无这个用户(根据bool类型的Flag)

2.判断表中Level列中的等级名称(根据表中的数据)

实现思路:

用户等级判断就是一层一层的调用(和登陆的顺序一样),到sqlHelper层中真正实例化和将数据赋值给表,在一层一层返回(用DataTable类接收),到U层判断表中的数据,根据数据不同,显示不同等级的窗体

代码:

U层(PS:Flogin是外观层的实例化的对象名)

if (flag)
            {
                //隐藏当前窗体
                this.Hide();
                this.DialogResult = System.Windows.Forms.DialogResult.OK;

                //一层一层掉方法,到sqlHelper中真正的实例化,将user传进去,进行判断用户的等级,返回在表中
                DataTable level = Flogin.SelectLevel(user);
                //查询到的表中的位置的内容=一般用户或其他,将显示内容
                if (level.Rows[0][2].ToString().Trim() == "一般用户")
                {
                    //实例化一般用户窗体
                    FrmNormalMain frmstu = new FrmNormalMain();
                    //显示实例化的学生界面
                    frmstu.Show();
                }
                else if (level.Rows[0][2].ToString().Trim() == "操作员")
                {
                    //实例化操作员窗体
                    FrmOperatorMain frmopert = new FrmOperatorMain();
                    //显示操作员窗体
                    frmopert.Show();
                }
                else if (level.Rows[0][2].ToString().Trim() == "管理员")
                {
                    //实例化管理员窗体
                    FrmAdminMain frmadmin = new FrmAdminMain();
                    //显示管理员窗体
                    frmadmin.Show();
                }

            }

            else
                {
                    MessageBox.Show("用户名或密码不正确", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }

外观层:

public DataTable SelectLevel(LoginEntity.UserInfo Userlevel)
        {
            //实例化业务逻辑层(B层)
            LoginBLL.UserBLL levelBLL = new LoginBLL.UserBLL();
            //将等级传入B层,用DataTable接收返回值
            DataTable level = levelBLL.LevelBLL(Userlevel);
            //返回DataTable level
            return level;
        }

B层:

public DataTable LevelBLL(LoginEntity.UserInfo userInfo)
        {
            //实例化工厂
            LoginFactory.Factory fact = new LoginFactory.Factory();
            //调用工厂方法创建接口,用接口层来接收工厂方法中返回的连接哪个数据库
            LoginIDAL.IuserInfoDAL idal = fact.CreatUser();
            //接收D层的返回值,根据数据库调用接口的方法
            DataTable level = idal.SelectUser(userInfo);

            return level;
        }

PS:这一层之后就是连接数据库,将数据赋值给DataTable表中(DataTable表实例化在sqlHelper层)

 

### 处理 WinForms 中不同 DPI 下的窗口适配与缩放 在开发 .NET WinForms 应用程序时,处理不同 DPI 设置下的窗口适配是一个重要的挑战。为了确保应用程序能够在各种分辨率和 DPI 设置下正常工作并保持良好的用户验,可以采取以下措施。 #### 启用 DPI 感知 首先,需要启用应用程序的 DPI 感知功能。这可以通过修改项目的 `app.manifest` 文件实现。具而言,可以在文件中添加如下配置: ```xml <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> </windowsSettings> </application> ``` 上述 XML 配置将应用程序设置为支持每台显示器独立的 DPI 缩放模式[^4]。 #### 使用合适的 HighDpiMode 属性 从 .NET Framework 4.7 开始引入了 `Application.HighDpiMode` 属性,允许开发者控制应用程序如何响应 DPI 改变。以下是几种常见的枚举值及其用途: - **DpiUnaware**: 窗口随 DPI 改变而缩放,假设所有屏幕的比例均为 100%。 - **SystemAware**: 查询主显示器的一次性 DPI 值,并将其应用于整个应用程序。 - **PerMonitor**: 创建窗口时检查其所在显示器的 DPI 并相应调整缩放比例。 - **PerMonitorV2**: 类似于 PerMonitor,但提供了更好的子窗口 DPI 更改通知以及改进的控件缩放效果。 推荐使用 `PerMonitorV2` 来获得最佳验,因为它能够更好地适应多显示器环境中的动态 DPI 变化。 #### 自动缩放机制的应用 WinForms 提供了一个内置的功能——自动缩放(AutoScaling),它可以帮助控件根据当前系统的 DPI 设置进行适当调整。要利用这一特性,需注意以下几点: - 将窗的 `AutoScaleMode` 属性设为 `Dpi` 或者 `Font`,以便使控件尺寸随着字大小或者 DPI 的变化同步改变[^5]。 例如,在设计器中设定某 Form 的 AutoScaleMode 如下所示即可生效: ```csharp this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; ``` 对于某些复杂布局无法完全依赖自动缩放完成的情况,则可能还需要手动干预部分细节位置或大小计算过程。 #### 图像资源管理 针对图片类静态素材也需要特别关注其清晰度问题。建议准备多个分辨版本的图标或其他图形资产存放在项目目录下;运行期间依据实际需求加载对应质量等级的数据源来呈现给最终用户查看[^3]。 --- ### 示例代码展示 下面给出一段简单的 C# 实现片段用来演示基本操作流程: ```csharp using System; using System.Drawing; using System.Windows.Forms; namespace DpiAdaptiveApp { public partial class MainForm : Form { public MainForm() { InitializeComponent(); this.AutoScaleMode = AutoScaleMode.Dpi; // Enable automatic scaling based on DPI. AdjustFormSizeForCurrentDPI(); // Custom method to fine-tune form dimensions. LoadImagesAtCorrectResolution(); // Ensure images are loaded at the correct resolution. } private void AdjustFormSizeForCurrentDPI() { float scaleFactorX, scaleFactorY; using (Graphics g = CreateGraphics()) { scaleFactorX = g.DpiX / 96F; scaleFactorY = g.DpiY / 96F; } Size scaledSize = new Size((int)(Width * scaleFactorX), (int)(Height * scaleFactorY)); this.Size = scaledSize; } private void LoadImagesAtCorrectResolution() { string imagePath = GetImagePathBasedOnDpi(CreateGraphics().DpiX); pictureBox.ImageLocation = imagePath; } private static string GetImagePathBasedOnDpi(float dpi) { return dpi >= 144 ? @"Resources\high_res_image.png" : dpi >= 120 ? @"Resources\medium_res_image.png" : @"Resources\low_res_image.png"; } } } ``` ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值