Использование одного и того же объекта в разных классах при сохранении содержимого одного объекта - PullRequest
1 голос
/ 04 ноября 2011

У меня 3 класса. Первый класс - это класс Authorize, который имеет свойство get / set для User и Pass. Во-вторых, класс Add создает новый экземпляр класса Authorize и присваивает значения из его текстовых полей свойствам, используя инициализацию нового объекта:

Authorize authorize = new Authorize();

Третий класс, Display, пытается получить значение свойства User и Pass из класса Authorize. Проблема в том, что я не могу использовать здесь новый объект Authorize, поскольку он будет очищать содержимое первого созданного объекта.

// Can not do, because the object will be discarded and new one created.
Authorize authorize = new Authorize();

Как мне избежать / изменить это, чтобы я мог получить доступ к одному и тому же объекту из другого класса? Это теоретический пример. Я работаю над кодом, но это долго. При необходимости я могу опубликовать это здесь. Но пока я оставляю как есть.

Пожалуйста, задавайте вопросы, если я не достаточно ясен.

Примеры для чайников настоятельно рекомендуется:)

Привет

- Правка - Код:

AddEntryWindow.sc as Показать класс

namespace Store_Passwords_and_Serial_Codes
{
    public partial class AddEntryWindow : Form
    {
        private string user, pass;

        // Initializind ArrayList to store all data needed to be added or retrived.
        static private ArrayList addedEntry = new ArrayList();

        // Initializing MainWindow form.
        MainWindow mainWindow;

        // Making authentication possible.
        // AuthenticateUser authenticateUser = new AuthenticateUser();

        EncryptDecrypt en = new EncryptDecrypt();

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

        public AddEntryWindow(MainWindow viaParameter) : this()
        {
            mainWindow = viaParameter;
        }

        public AddEntryWindow(string user, string pass)
        {
            this.user = user;
            this.pass = pass;
        }

        private void btnAddEntry_Click(object sender, EventArgs e)
        {
            // Making sure that type is selected.
            if {}
            else
            {
                // reason why I need the content of AuthenticationUser content.
                string encrypted = en.Encrypt(stringBuilder.ToString(), user, pass);
                string decrypted = en.Decrypt(encrypted, user, pass);

                MessageBox.Show(user + pass);
                    //encrypted + Environment.NewLine + decrypted;

                /*mainWindow.ChangeTextBox = stringBuilder.ToString() + Environment.NewLine +
                    "Encrypted" + Environment.NewLine +
                    encrypted + Environment.NewLine +
                    "Decrypted" + Environment.NewLine +
                    decrypted + Environment.NewLine;
                */
            }
        }

        public static void ShowMe(AuthenticateUser au)
        {
            au.UserName = user;
            au.Password = pass;
        }

        private void cmbType_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Deciding which data must be entered depending on
            // what type is selected from combo box.

            // PC
            // Web Site
            // Serial Code
        }
    }
}

AuthenticationWindow.cs as Добавить класс

namespace Store_Passwords_and_Serial_Codes
{
    public partial class AuthenticationWindow : Form
    {
        public AuthenticationWindow()
        {
            InitializeComponent();
        }

        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
            {
                AuthenticateUser au = new AuthenticateUser();

                au.UserName = txtUserName.Text;
                au.Password = txtPassword.Text;

                AddEntryWindow.ShowMe(au);

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

                Close();
            }
        }
    }
}

Менее важный AuthenticateUser.cs как класс Authorize.

using System;

namespace Store_Passwords_and_Serial_Codes
{
    public 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;
            }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Редактировать:

Вы дали немного больше разъяснений в своем вопросе, поэтому я постараюсь ответить на него.

В основной форме сделайтеВаш код делает что-то вроде этого:

private AuthenticateUser storedAuth; // shared data...

private void btnLogin_Click(object sender, EventArgs e)
{
    AuthorizeWindow authWindow = new AuthorizeWindow();
    authWindow.ShowDialog();
    storedAuth = authWindow.Result; // Get the auth result back...
}

В AuthorizeWindow создайте свойство результата и установите его, когда вы нажмете ОК и заполните все данные:

public AuthenticateUser Result { get; set; }

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
    {
        // Don't try to call the other window here, just set the result and close...
        Result = new AuthenticateUser();
        Result.UserName = txtUserName.Text;
        Result.Password = txtPassword.Text;

        Close();
    }
 }

Затем в главной форме, когда вы создаете и открываете AddEntryWindow, передаете ему аутентификацию, которую вы сохранили:

private void btnAdd_Click(object sender, EventArgs e)
{
    AddEntryWindow addWindow =
        new AddEntryWindow(storedAuth.User, storedAuth.Password);
    addWindow.ShowDialog();
}

Но, к сожалению, я создал небольшую ошибку здесь.Сначала мы должны проверить, прошли ли они аутентификацию:

private void btnAdd_Click(object sender, EventArgs e)
{
    if(storedAuth == null)
    {
        MessageBox.Show("You must log in before you add an entry");
    }
    else
    {
        AddEntryWindow addWindow =
            new AddEntryWindow(storedAuth.User, storedAuth.Password);
        addWindow.ShowDialog();
    }
}

Кроме того, я обнаружил небольшую ошибку в вашем коде AddEntryWindow.Убедитесь, что все конструкторы для всех ваших окон всегда вызывают InitializeComponent.В этом случае отредактируйте конструктор, который использует имя пользователя и пароль, чтобы вызвать конструктор по умолчанию, как ваш другой конструктор, который принимает MainWindow:

public AddEntryWindow(string user, string pass)
    : this() // important!
{
    this.user = user;
    this.pass = pass;
}

Перед редактированием:

Я не совсем понимаю ваш пример кода.Было бы проще, если бы вы создали новые примеры кода, чтобы добавить к вашему вопросу.

Вот что я понял из того, что вы сказали:

public class Authorize
{
    public string Username { get; set; }
    public string Password { get; set; }
}

public class Add
{
    public void Login()
    {
        Authorize authorize = new Authorize();
        authorize.Username = usernameTextBox.Text;
        authorize.Password = passwordTextBox.Text;
        // Todo: Rest of login logic here
    }

    // Todo: Other code here...
}

public class Display
{
    public void Show()
    {
        Authorize authorize = new Authorize();
        // uh oh, Username and Password are null!
    }

    // Todo: Other code here...
}

Решение

Самый простой способ сделать это - передать экземпляр Authorize методу Show (или как вы его на самом деле вызываете) в вашем классе Display.Просто примите экземпляр Authorize в качестве аргумента этого метода:

public class Display
{
    public void Show(Authorize authorize)
    {
        // Now we have the values that the Login method created...
    }

    // ...
}

public class Add
{
    public void Login()
    {
        Authorize authorize = new Authorize();
        authorize.Username = usernameTextBox.Text;
        authorize.Password = passwordTextBox.Text;
        display.Show(authorize);
    }

    // ...
}
0 голосов
/ 04 ноября 2011

Передача в качестве аргумента является лучшим решением, если у вас есть проблема с передачей в качестве аргумента, затем выберите Авторизовать как свойство (Set / Get), чтобы вы могли избавиться от проблемы передачи аргумента.Если это тоже проблема, то либо используйте Singleton Pattern, либо создайте класс Static.

0 голосов
/ 04 ноября 2011

Есть два способа достичь того, что вы ищете.Во-первых, нужно просто передать один экземпляр Authority всем различным методам, которые будут его использовать.Я предполагаю, что это по какой-то причине запрещено, иначе вы бы уже это делали.Существует шаблон проектирования под названием singletons , который может быть полезен для того, что вы делаете.На связанной странице есть несколько примеров кода.

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