C#从窗口窗口传递一个对象后,我无法访问对象属性

时间:2017-10-24 03:14:13

标签: c# visual-studio

所以我正在编写一个处理连接到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

班级PwdUsario x = new Usuario发生的地方,我的代码的任何部分都不会再发生。但正如您所见,我可以在User.Admin中使用Menu,但我找不到任何方式来访问User.Pwd类中的Alta

1 个答案:

答案 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对象存储在MenuMenu.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;
}