类变量在类实例化后重置

本文关键字:实例化 类变量 | 更新日期: 2023-09-27 18:21:08

所以我正在编写一个应用程序,它有一个登录屏幕和一个菜单屏幕。

菜单为每个级别的用户启用了不同的按钮。为了在用户登录时做到这一点,会分配一个int,让应用程序知道用户登录的级别以及要启用的按钮/报告。

我遇到的问题是,当关闭报告并再次调用菜单时,变量会重置回默认的管理级别。

Menu M = new Menu(Permission);
M.Show();
this.Hide();

此代码用于从登录中调出菜单,int正被传递给构造函数。

public Menu(string Permission)
        {
            InitializeComponent();
            AccessLevel = int.Parse(Permission);
            LockKeys();
        }
        public Menu()
        {
            InitializeComponent();
            LockKeys();
        }

现在,这是将int赋值给类变量的菜单代码。

我有10个不同的报告,当我按下报告的返回键时,这就是我调用菜单的方式。

Menu shwMenu = new Menu();
shwMenu.Show();
this.Hide();

现在我明白了问题是它调用的构造函数没有分配变量。现在,我所能想到的就是将变量反弹到每个报告并返回,只需调用正确的构造函数。

我的问题是,有更简单的方法吗?保存类变量的某种方法,这样我就不必每次调用类时都重新实例化它。

public partial class Menu : Form
    {
        private int AccessLevel;   
        public Menu(string Permission)
        {
            InitializeComponent();
            AccessLevel = int.Parse(Permission);
            LockKeys();
        }
        public Menu()
        {
            InitializeComponent();
            LockKeys();
        }
        private void LockKeys()
        {
            if(AccessLevel == 1)
            {
                btnSR.Enabled = false;
                btnVSC.Enabled = false;
                btnPT.Enabled = false;
                btnCT.Enabled = false;
                btnTS.Enabled = false;
                btnBookJob.Enabled = false;
                btnCompJob.Enabled = false;
                btnCompServ.Enabled = false;
                btnVS.Enabled = true;
            }
            else if (AccessLevel == 2)
            {
                btnSR.Enabled = false;
                btnVSC.Enabled = false;
                btnPT.Enabled = false;
                btnCT.Enabled = false;
                btnTS.Enabled = false;
                btnBookJob.Enabled = true;
                btnCompJob.Enabled = true;
                btnCompServ.Enabled = false;
                btnVS.Enabled = false;
            }
            else if (AccessLevel == 3)
            {
                btnSR.Enabled = false;
                btnVSC.Enabled = false;
                btnPT.Enabled = false;
                btnCT.Enabled = false;
                btnTS.Enabled = false;
                btnBookJob.Enabled = true;
                btnCompJob.Enabled = false;
                btnCompServ.Enabled = true;
                btnVS.Enabled = false;
            }
            else if (AccessLevel == 4)
            {
                btnSR.Enabled = false;
                btnVSC.Enabled = false;
                btnPT.Enabled = false;
                btnCT.Enabled = false;
                btnTS.Enabled = true;
                btnBookJob.Enabled = false;
                btnCompJob.Enabled = false;
                btnCompServ.Enabled = false;
                btnVS.Enabled = false;
            }
        }
        private void btnVS_Click(object sender, EventArgs e)
        {
            VehicleStatR1 VS = new VehicleStatR1();
            VS.Show();
            this.Hide();
        }
        private void btnSR_Click(object sender, EventArgs e)
        {
            ServRequireR3 SR = new ServRequireR3();
            SR.Show();
            this.Hide();
        }
        private void btnVSC_Click(object sender, EventArgs e)
        {
            VehServCompleteR4 VSC = new VehServCompleteR4();
            VSC.Show();
            this.Hide();
        }
        private void btnPT_Click(object sender, EventArgs e)
        {
            PlannedTripR6 PT = new PlannedTripR6();
            PT.Show();
            this.Hide();
        }
        private void btnCT_Click(object sender, EventArgs e)
        {
            ActualTripR7 CT = new ActualTripR7();
            CT.Show();
            this.Hide();
        }
        private void btnTS_Click(object sender, EventArgs e)
        {
            HoursWorkedR8 TS = new HoursWorkedR8();
            TS.Show();
            this.Hide();
        }
        private void btnBookJob_Click(object sender, EventArgs e)
        {
            BookJobServ BJ = new BookJobServ();
            BJ.Show();
            this.Hide();
        }
        private void btnCompJob_Click(object sender, EventArgs e)
        {
            CompJob CJ = new CompJob();
            CJ.Show();
            this.Hide();
        }
        private void btnCompServ_Click(object sender, EventArgs e)
        {
            CompServ CS = new CompServ();
            CS.Show();
            this.Hide();
        }
        private void btnLogOut_Click(object sender, EventArgs e)
        {
            LogIn LI = new LogIn();
            this.Hide();
            LI.Show();
        }
        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }

这是菜单类,我一直在回溯,但AccessLevel变量更改为默认值。

感谢

类变量在类实例化后重置

我认为您正在寻找的是一个"静态"变量,它是一个类级变量。

private static int AccessLevel;

静态变量是在类级别中定义的,类的所有实例都可以访问和修改它们。换句话说,静态变量在类实例之间共享。更多信息:https://msdn.microsoft.com/en-us/library/98f28cdx.aspx?f=255&MSPP错误=-2147217396

另一种选择是使用一个静态类来保存您需要的所有信息,例如:

public static class CurrentUser
{
    public static string UserName { get; set; }
    public static int AccessLevel { get; set; }
}

用户登录时使用的:

public void LogUserIn(string userName, string password)
{
    //Make sure to reset, so an invalid login doesn't retain data
    LogUserOut();
    //Do the user validation here
    CurrentUser.UserName = userName;
    CurrentUser.AccessLevel = 0; //whatever was read from your user database
}
public void LogUserOut()
{
    CurrentUser.UserName = "";
    CurrentUser.AccessLevel = int.MinValue;
}

然后,当你需要使用访问级别时,你不需要担心传递值,例如,你的菜单表单会是这样的:

public partial class Menu : Form
{
    public Menu()
    {
        InitializeComponent();
        LockKeys();
    }
    private void LockKeys()
    {
        if(CurrentUser.AccessLevel == 1)
        {
            //Enable/Disable Controls
        }
        else if (CurrentUser.AccessLevel == 2)
        {
            //Enable/Disable Controls
        }
        else if (CurrentUser.AccessLevel == 3)
        {
            //Enable/Disable Controls
        }
        else if (CurrentUser.AccessLevel == 4)
        {
            //Enable/Disable Controls
        }
    }
}

附带说明一下,为了避免代码重复并提高安全性,您应该创建初始化函数LockKeys,如下所示:

    private void LockKeys()
    {
        //Set them all default false, and then only enable.
        btnSR.Enabled = false;
        btnVSC.Enabled = false;
        btnPT.Enabled = false;
        btnCT.Enabled = false;
        btnTS.Enabled = false;
        btnBookJob.Enabled = false;
        btnCompJob.Enabled = false;
        btnCompServ.Enabled = false;
        btnVS.Enabled = false;
        if(AccessLevel == 1)
        {
            btnVS.Enabled = true;
        }
        else if (AccessLevel == 2)
        {
            btnBookJob.Enabled = true;
            btnCompJob.Enabled = true;
        }
        else if (AccessLevel == 3)
        {
            btnBookJob.Enabled = true;
            btnCompServ.Enabled = true;
        }
        else if (AccessLevel == 4)
        {
            btnTS.Enabled = true;
        }
    }