Что-то не так при передаче свойства из одного класса в другой - PullRequest
0 голосов
/ 04 ноября 2011

У меня 3 класса. Одним из них является AuthenticateUser, который позволяет мне устанавливать и получать информацию о пользователе, такую ​​как имя пользователя и пароль. В другом классе AddEntryWindow - это WinForm, в которой я пытаюсь отобразить содержимое свойств Password и UserName из AuthenticateUser. третий класс - другой класс 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 ]

1 голос
/ 04 ноября 2011

Здесь я мог бы предложить немного обходного пути для вашего вопроса, я надеюсь, что это то, что вы ищете.

Если вы вызываете или запускаете форму AddWindowEntry из AuthenticationWindow, предполагая, что AuthenticationWindow является родительской формой, то вы создали объект AuthenticateUser в этом классе.Передайте этот экземпляр в дочернюю форму, т.е. AddWindowEntry, и установите для нее локальную переменную.Поэтому, когда событие btnAddEntry_Click будет выполнено, вы можете отобразить содержимое этой локальной переменной в окне сообщения.

1 голос
/ 04 ноября 2011

Как сказал Джон, вам нужно изменить код следующим образом:

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();
        }
    }
}
1 голос
/ 04 ноября 2011

Вы создаете два отдельных экземпляра AuthenticateUser, один в AddEntryWindow и один в AuthenticationWindow. То, что они имеют одинаковое имя, не означает, что они в одном и том же scope.

Не зная, как работает ваша программа, я не могу дать вам лучший вариант, но можно было бы создать static class, который действует как глобальный для AuthenticateUser. Другой вариант - выяснить, как передавать информацию между вашими Forms. Если вы создадите AuthenticationWindow из AddEntryWindow, вы можете установить экземпляр AuthenticateUser как открытый в AuthenticationWindow, а затем получить к нему доступ, когда окно закроется перед вами dispose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...