Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从类中获取值并将其设置为C中窗体上的变量#_C#_Class - Fatal编程技术网

C# 如何从类中获取值并将其设置为C中窗体上的变量#

C# 如何从类中获取值并将其设置为C中窗体上的变量#,c#,class,C#,Class,我是C#新手,一直在开发一个数据库应用程序来练习编程。我已经创建了一个登录表单,它将从users表中检索安全级别并将值设置为类。一旦值在类中,我想从类中检索该值,并将其设置为我的主形式的变量。一旦我有了变量,我就可以根据特权级别执行一些逻辑来启用或禁用对某些功能的访问。我的问题是如何从类中检索值并将其设置为主窗体上的变量 这是我在登录表单上的登录方法 private void Login() { try { NpgsqlConne

我是C#新手,一直在开发一个数据库应用程序来练习编程。我已经创建了一个登录表单,它将从users表中检索安全级别并将值设置为类。一旦值在类中,我想从类中检索该值,并将其设置为我的主形式的变量。一旦我有了变量,我就可以根据特权级别执行一些逻辑来启用或禁用对某些功能的访问。我的问题是如何从类中检索值并将其设置为主窗体上的变量

这是我在登录表单上的登录方法

 private void Login()
    {
        try
        {
            NpgsqlConnection conn = Connection.getConnection();
            conn.Open();

            NpgsqlCommand cmd = new NpgsqlCommand("select * from \"Users\" where \"UserName\" = :username and \"Password\" = :password;", conn);
            cmd.Parameters.Add(new NpgsqlParameter("username", Username));
            cmd.Parameters.Add(new NpgsqlParameter("password", Password));
            NpgsqlDataReader dr = cmd.ExecuteReader();

            //var result = cmd.ExecuteScalar();
            //int i = Convert.ToInt32(result);

            if (dr.Read())
            {
                PrivilegeCheck pc = new PrivilegeCheck();
                Level = dr.GetInt32(3);
                pc.PrivilegeLevel = Level;
                this.Hide();
                frmMain frmMain = new frmMain();
                frmMain.Show();
            }
            else
            {
                MessageBox.Show("Username and/or password is incorrect.", "Wrong Login Information", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //txtUsername.Text = "";
                //txtPassword.Text = "";
                txtUsername.Focus();
            }

            conn.Close();
            dr.Dispose();
            cmd.Dispose();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
这是我的班级

class PrivilegeCheck
{
    private int privilegeLevel;

    public int PrivilegeLevel
    {
        get
        {
            return privilegeLevel;
        }
        set
        {
            privilegeLevel = value;
        }


    }
}

提前感谢

表单与其他任何表单一样都是对象。您通常如何将数据获取到对象中?设置属性或调用方法并传递参数,对吗?那你在这里就是这么做的。您需要在
frmMain
类中声明适当的成员,然后在显示表单之前调用该成员。

在不进入设计模式的情况下,并保持示例的简单性,您可以简单地返回PriviligeCheck类型,而不是void:

public PrivelegeCeck Login(string username, string password) {
{
        NpgsqlCommand cmd = new NpgsqlCommand("select * from \"Users\" where \"UserName\" = :username and \"Password\" = :password;", conn);
        cmd.Parameters.Add(new NpgsqlParameter("username", username));
        cmd.Parameters.Add(new NpgsqlParameter("password", password));
    ...
    ...
    PrivelegeCheck check;
    int privelegeLevel = 0;

    if(reader.Read()) {
       check = new PrivelegeCheck();
       // We try parsing the reader ordinal by passing in the field name reference
       if(int.TryParse(r["<field_name_here>"].ToString(), out privelegeLevel))
          check.PrivelegeLevel = privelegeLevel;
    }

    // Dispose your reader related objects below
    ...
    ...


    return check;
}

你的问题有点让人困惑。有几种方法可以做到这一点

一个选项是在表单中创建属性,如下所示:

public partial class frmMain : Form
{
    private PrivilegeCheck _check { get; set; }

    // Form constructor
    public frmMain(PrivilegeCheck check)
    {
        _check = check;
        InitializeComponent();
    }

    // ... Use _check in your form.
}
您可以这样使用它:

PrivilegeCheck pc = new PrivilegeCheck();
Level = dr.GetInt32(3);
pc.PrivilegeLevel = Level;
this.Hide();
frmMain frmMain = new frmMain(pc); // Pass it to your form
frmMain.Show();
PrivilegeCheck pc = new PrivilegeCheck();
Level = dr.GetInt32(3);
pc.PrivilegeLevel = Level;
this.Hide();
frmMain frmMain = new frmMain();
frmMain.Privilege = pc; // Set the privilege
frmMain.Show(); // then show the form.
或者,您可以将表单的属性公开,如下所示:

public partial class frmMain : Form
{
    private PrivilegeCheck _privilege;

    public PrivilegeCheck Privilege
    { 
        get { return _privilege; } 
        set
        {
            // Privilege was set, do stuff on your form here.

            // Then store the value
            _privilege = value;
        }
    }
}
您可以这样使用它:

PrivilegeCheck pc = new PrivilegeCheck();
Level = dr.GetInt32(3);
pc.PrivilegeLevel = Level;
this.Hide();
frmMain frmMain = new frmMain(pc); // Pass it to your form
frmMain.Show();
PrivilegeCheck pc = new PrivilegeCheck();
Level = dr.GetInt32(3);
pc.PrivilegeLevel = Level;
this.Hide();
frmMain frmMain = new frmMain();
frmMain.Privilege = pc; // Set the privilege
frmMain.Show(); // then show the form.
在练习C#!:)时玩得开心

更新 第三种方法是使类保持静态,如下所示:

public static class PrivilegeCheck
{
    public static int PrivilegeLevel { get; set; }
}
然后,您可以执行以下操作:

Level = dr.GetInt32(3);
PrivilegeCheck.PrivilegeLevel = Level; // see here
this.Hide();
frmMain frmMain = new frmMain();
frmMain.Show();
然后以您的形式:

public partial class frmMain : Form
{
    // ... Use PrivilegeCheck.PrivilegeLevel
}

第二个选项可能是对于C新的新手来说,这两个选项比较容易,除非他们有其他面向对象语言(如C++或java)的经验。这个答案也和@jmcilhinney在他的答案中推荐的差不多。我会试试看,我很抱歉,但我遗漏了一个细节。我之所以要使用该类,是因为主窗体不是我要检查特权级别的唯一位置。它将在多个表单上进行检查。我这样做是为了看看它是否可以做到,并且为了实验打赌:)@Evanark查看我的更新。您可以将PrivilegeCheck类设置为静态,并从任何形式访问PrivilegeLevel属性。非常感谢!第三个选择正是我想要实现的!:)@Scott Prokopetz感谢您关于避免从数据库读取硬编码值的建议。我将利用您的建议进一步提高我对C#的了解,并感谢所有其他人,非常感谢您的建议!一句警告的话。。。避免像从数据库中读取安全级别字段时那样硬编码值。一方面,在没有访问数据库模式的情况下阅读代码的人不可能知道您实际阅读的内容;但是,也不能保证现场位置将保持静止。最好使用字段名获取值。如果由于任何原因字段名发生了更改,则要比由于任何原因修改数据库并对字段重新排序容易得多。