所以我正在编写一个处理连接到SQL数据库的库存的应用程序。我正在编写应用程序的“管理员”端,对于重要任务,我要求管理员输入密码以确认更改。但是,一旦我尝试访问对象属性,我找不到任何方法。我会一步一步解释:
public class Usuario
{
public int id { get; set; }
public String Log { get; set; }
public String Pwd { get; set; }
public String User { get; set; }
public Boolean Activo { get; set; }
public Boolean Admin { get; set; }
public Boolean Reportes { get; set; }
public Usuario() { }
public Usuario(int id, string User, bool Activo, bool Admin, bool Reports)
{
this.id = id;
this.User = User;
this.Activo = Activo;
this.Admin = Admin;
this.Reportes = Reportes;
}
}
所以这是我制作的用户类。然后,当应用程序启动时,我有一个密码窗口,代码如下:
public Pwd()
{
InitializeComponent();
}
public Usuario UserA;
private void Button_Click(object sender, RoutedEventArgs e)
{
String res;
Conexion c = new Conexion();
res = c.Password(txUsuario.Text, txPassword.Text);
if (res == "1")
{
UserA = (Usuario)usuarioActual(txUsuario.Text, txPassword.Text);
if (UserA.Activo)
{
Menu m = new Menu();
Menu.User = UserA;
m.Show();
this.Hide();
}
else
{
MessageBox.Show("Usuario no está activo");
}
}
else
MessageBox.Show("Usuario o contraseña incorrectos");
}
public static Object usuarioActual(String user, String pass)
{
int id;
String User;
Boolean Activo;
Boolean Admin;
Boolean Reporte;
id = Id(user, pass);
User = nombreUser(user, pass);
Activo = estaActivo(user,pass);
Admin = esAdmin(user, pass);
Reporte = Reportes(user, pass);
Usuario Actual = new Usuario(id, User, Activo, Admin, Reporte);
return Actual;
}
所以这里最重要的是我有一个公共“UserA”。 “usuarioActual”方法创建一个“新”用户并将其保存到类的公共UserA中
然后,一旦用户和密码正确,我打开下一个窗口并将用户设置为与新窗口用户相同。如下:
this.Hide();
Menu m = new Menu();
m.Show();
Menu.User = UserA;
所以我只是在Windows之间“弹跳”我的用户,直到我到达我想要使用我的用户的密码的那个
public Alta()
{
InitializeComponent();
}
public static Usuario UserA;
bool Activo = true;
bool Admin = false;
bool Reportes = true;
bool cambio = false;
private void btAlta_Click(object sender, RoutedEventArgs e)
{
String res;
if (Campos())
{
res = Interaction.InputBox("Está por realizar un alta, para confirmarla escriba su contraseña:", "Confirmación");
if (res.Equals(UserA.Pwd.ToString()))
{
altaUser(tbLogin, tbPass, tbNombre, Activo, Admin, Reportes);
MessageBox.Show("Usuario agregado satisfactoriamente");
cambio = true;
}
else MessageBox.Show("Contraseña incorrecta intente de nuevo");
}
else
MessageBox.Show("Existe algún error en los campos o quedaron vacíos");
}
所以这里是最重要的。我只想比较用户在输入框中给出的响应与“User”.pwd属性。我已经尝试过了:
if (res.Equals(UserA.Pwd.ToString()))
if (res.Equals(UserA.Pwd))
if (res == (UserA.Pwd.ToString())
if (res == UserA.Pwd)
但它会在每种情况下抛出“未设置为对象实例的对象引用”错误,但是:
我知道自从我第一次将它传递到“菜单”窗口后,我的对象就被传递了我用它来查看用户是否是管理员
public Menu()
{
InitializeComponent();
}
public static Usuario User;
private void button4_Click(object sender, RoutedEventArgs e)
{
if (User.Admin)
{
PreAdmin a = new PreAdmin();
PreAdmin.UserB = User;
a.Show();
this.Hide();
}
else
MessageBox.Show("El usuario actual no tiene permiso de administrador");
}
如果我使用
MessageBox.Show(UserA.ToString());
它显示:
WpfApplication_Almacen.Usuario
如果有人发现我的错误/我应该这样做,我将不胜感激。现在已经让我放慢了几个小时。
public PreAdmin()
{
InitializeComponent();
}
public static Usuario UserB;
private void button_Click(object sender, RoutedEventArgs e)
{
Alta a = new Alta();
Alta.UserA = UserB;
a.Show();
this.Hide();
}
所以这是订单:Usuario
- > Pwd
- > Menu
- > Pre-admin
- > Alta
班级Pwd
是Usario x = new Usuario
发生的地方,我的代码的任何部分都不会再发生。但正如您所见,我可以在User.Admin
中使用Menu
,但我找不到任何方式来访问User.Pwd
类中的Alta
答案 0 :(得分:0)
我希望这可以解决您的问题。
首先,覆盖ToString()
Usuario
public class Usuario
{
public int id { get; set; }
public String Log { get; set; }
public String Pwd { get; set; }
public String User { get; set; }
public Boolean Activo { get; set; }
public Boolean Admin { get; set; }
public Boolean Reportes { get; set; }
public Usuario() { }
public Usuario(int id,string User, bool Activo, bool Admin, bool Reportes)
{
this.id = id;
this.User = User;
this.Activo = Activo;
this.Admin = Admin;
this.Reportes = Reportes;
}
public override string ToString()
{
return string.Format(
"User ID: {1}{0} at {0}Name: {2}{0}Activo: {3}",
Environment.NewLine,
this.id,
this.User,
this.Activo);
}
}
现在,关于对象引用问题。我看到您已将Userio
对象存储在Menu
中Menu.User
的静态变量中。希望我的看法是正确的,您可以将btAlta_Click
编辑为:
private void btAlta_Click(object sender, RoutedEventArgs e)
{
String res;
if (Campos())
{
res = Interaction.InputBox("Está por realizar un alta, para confirmarla escriba su contraseña:", "Confirmación");
// I would suggest to add this line of code
if(UserA == null)
{
UserA = Menu.User;
}
if (res.Equals(UserA.Pwd.ToString()))
{
altaUser(tbLogin, tbPass, tbNombre, Activo, Admin, Reportes);
MessageBox.Show("Usuario agregado satisfactoriamente");
cambio = true;
}
else MessageBox.Show("Contraseña incorrecta intente de nuevo");
}
else
MessageBox.Show("Existe algún error en los campos o quedaron vacíos");
}
或者,您可以将Alta
的属性编辑为:
public static Usuario UserA
{
get
{
return Menu.User;
}
}
两种解决方案中的任何一种都适合你。
想念你从未设置过Pwd!
public static Object usuarioActual(String user, String pass)
{
int id;
String User;
Boolean Activo;
Boolean Admin;
Boolean Reporte;
id = Id(user, pass);
User = nombreUser(user, pass);
Activo = estaActivo(user,pass);
Admin = esAdmin(user, pass);
Reporte = Reportes(user, pass);
Usuario Actual = new Usuario(id, User, Activo, Admin, Reporte);
// You need to add this:
Actual.Pwd = pass;
return Actual;
}