[英]C#: How can I set a maximal Value of a property from a derived class? (And not in base class)
[英]How can I get a value from a class and set it to a variable on a form in C#
我是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;
}
}
}
提前致谢
您的问题有点令人困惑。 有几种方法可以做到这一点。
一种选择是在表单中创建一个属性,如下所示:
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();
另外,您可以像这样将表单的属性公开:
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();
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
}
表单是一个像其他对象一样的对象。 通常如何将数据放入对象? 您将设置属性或调用方法并传递参数,对吗? 那就是你在这里所做的。 您需要在frmMain
类中声明适当的成员,然后在显示表单之前调用该成员。
无需进入设计模式并使示例保持简单,就可以简单地返回PriveligeCheck类型,而不是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;
}
在表单的某处,只需单击一下按钮,您就可以简单地调用:
PrivelegeCheck check = Login(txtUsername.Text, txtPassword.Text);
// no user was returned, trow an exception (or how ever you wish to handle that scenario.
if(check == null)
throw new Exception("User does not exist.");
if(ceck.PrivelegeLevel > 1) {
...
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.