在实例化类之后,类变量重置

时间:2015-11-09 14:39:58

标签: c# class variables constructor

所以我正在编写一个具有登录屏幕,然后是菜单屏幕的应用程序。

菜单为每个级别的用户启用了不同的按钮。要在用户登录时执行此操作,将分配一个int,让应用程序知道用户登录的级别以及要启用的按钮/报告。

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

TableView

此代码用于从登录中提取菜单,将int传递给构造函数。

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

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

我有10个不同的报告,当我在报告上点击后退键时,这就是我回调菜单的方式。

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

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

我的问题是,有更简单的方法吗?保存类变量的一些方法,所以每次调用类时都不需要重新实例化它。

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

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

由于

2 个答案:

答案 0 :(得分:1)

我认为你所寻找的是一个静态的"变量,它是一个类级变量。

private static int AccessLevel;

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

答案 1 :(得分:0)

另一个选择是使用一个包含所需信息的静态类,例如:

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;
        }

    }