将属性从一个类传递到另一个类时出错了

时间:2011-11-04 02:15:50

标签: c# winforms class properties

我有3节课。一个是AuthenticateUser,它允许我设置和获取用户信息,如用户名和密码。在其他类中,AddEntryWindow是一个WinForm,我试图在其中显示来自AuthenticateUser的Password和UserName属性的内容。第三类是另一个WinForm类,它允许我为AuthenticateUser类设置用户名和密码。在我尝试的时候,在这个简化的例子中,为了显示WinForm类的用户名和密码,我得到一个空白的消息框。此外,当在AuthenticateUserWindow中使用另一个消息框时,我能够获取属性的内容。

如何解决这个问题,以便能够在AddEntryWindow类中查看属性的内容?在过去的一小时里,我一直盯着这个。

可能是行:AuthenticateUser authenticateUser = new AuthenticateUser();创建了一个新对象。但它会在哪里呢?

AddEntryWindow.cs中最可能出现的问题

using System;
using System.Windows.Forms;
// Needed to be used with StringBuilder
using System.Text;
// Needed to be used with ArrayList.
using System.Collections;

namespace Store_Passwords_and_Serial_Codes
{
    public partial class AddEntryWindow : Form
    {
        // Making authentication possible.
        AuthenticateUser authenticateUser = new AuthenticateUser();

        // Default constructor to initialize the form.
        public AddEntryWindow()
        {
            InitializeComponent();
        }

        private void btnAddEntry_Click(object sender, EventArgs e)
        {
            MessageBox.Show(authenticateUser.UserName + authenticateUser.Password);
        }
    }
}

AuthenticateUser.cs

using System;

namespace Store_Passwords_and_Serial_Codes
{
    class AuthenticateUser
    {
        private string userName, password;

        public AuthenticateUser()
        {
        }

        public AuthenticateUser(string userNamePassed, string passwordPassed)
        {
            this.userName = userNamePassed;
            this.password = passwordPassed;
        }

        public string UserName
        {
            get
            {
                return userName;
            }
            set
            {
                userName = value;
            }
        }

        public string Password
        {
            get
            {
                return password;
            }
            set
            {
                password = value;
            }
        }
    }
}

AuthenticateUserWindow.cs

using System;
using System.Windows.Forms;

namespace Store_Passwords_and_Serial_Codes
{
    public partial class AuthenticationWindow : Form
    {
        // Most important log in information needs to be entered
        // for encrypting and decrypting binary file.
        AuthenticateUser authenticateUser;

        public AuthenticationWindow()
        {
            InitializeComponent();
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            // Closing Authentication Window form.
            Close();
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            // Clearing text boxes txtUserName and txtPassword
            // after Clear Form button is clicked.
            txtUserName.Clear();
            txtPassword.Clear();
        }

        private void btnAuthenticate_Click(object sender, EventArgs e)
        {
            if (txtUserName.Text == string.Empty || txtPassword.Text == string.Empty)
            {
                MessageBox.Show("Please fill both information first.");
            }
            else
            {
                // Passing the values to object AuthenticateUser.
                authenticateUser = new AuthenticateUser(txtUserName.Text, txtPassword.Text);

                MessageBox.Show(authenticateUser.UserName + authenticateUser.Password);

                Close();
            }
        }
    }
}

问候。

3 个答案:

答案 0 :(得分:1)

您正在创建两个AuthenticateUser的单独实例,一个在AddEntryWindow中,另一个在AuthenticationWindow中。仅仅因为它们具有相同的名称并不意味着它们处于相同的scope

在不知道您的计划如何运作的情况下,我无法为您提供最佳选择,但可以创建一个static class作为AuthenticateUser的全局。另一个选择是弄清楚如何在Forms之间传递信息。如果您从AuthenticationWindow创建AddEntryWindow,则可以在AuthenticateUser中将AuthenticationWindow的实例设置为公开,然后在窗口关闭之前访问dispose它的。

答案 1 :(得分:1)

在这里,我可以为您的问题推断出一些解决方法,我希望它能够满足您的需求。

如果从AuthenticationWindow调用或启动AddWindowEntry表单,假设AuthenticationWindow是父表单,那么您已在此类中创建了AuthenticateUser对象。将此实例传递给子窗体,即AddWindowEntry,并在那里设置为局部变量。因此,当执行btnAddEntry_Click事件时,您可以在消息框中显示此局部变量内容。

答案 2 :(得分:1)

就像John说的那样,你需要按如下方式更改代码:

public partial class AddEntryWindow : Form
{
    // Making authentication possible.
    AuthenticateUser authenticateUser = new AuthenticateUser();
    // Default constructor to initialize the form.
    public AddEntryWindow()
    {
        InitializeComponent();
    }

    private void btnAddEntry_Click(object sender, EventArgs e)
    {
        new AuthenticationWindow(authenticateUser).ShowDialog();
        MessageBox.Show(authenticateUser.UserName + authenticateUser.Password);
    }
}

...

public partial class AuthenticationWindow : Form
{
    // Most important log in information needs to be entered
    // for encrypting and decrypting binary file.
    AuthenticateUser authenticateUser;

    public AuthenticationWindow(AuthenticateUser user)
    {
        InitializeComponent();
        authenticateUser = user;
    }

    ...

    private void btnAuthenticate_Click(object sender, EventArgs e)
    {
        if (txtUserName.Text == string.Empty || txtPassword.Text == string.Empty)
        {
            MessageBox.Show("Please fill both information first.");
        }
        else
        {
            // Passing the values to object AuthenticateUser.
            authenticateUser.UserName = txtUserName.Text;
            authenticateUser.Password = txtPassword.Text;

            MessageBox.Show(authenticateUser.UserName + authenticateUser.Password);

            Close();
        }
    }
}