Как проверить в режиме реального времени, если данные были введены из одного из классов в поле texbox? - PullRequest
0 голосов
/ 05 ноября 2011

Мой вопрос связан с проблемой, которая у меня есть сейчас. У меня есть MainWindow, AuthenticateWindow и AddEntryWindow, которые все являются WinForms. В главном окне у меня есть возможность аутентифицироваться и добавить запись в мое основное окно. Они не могут добавить запись, пока они не аутентифицируются (с этим нет проблем). Мне нужно добавить запись в текстовое поле, которое обновит текстовое поле моего главного окна. Проблема, если, как я могу проверить, была ли запись добавлена ​​в мое текстовое поле?

Я пытаюсь использовать опцию Сохранить из меню. Я получаю сообщение об ошибке всякий раз, когда пытаюсь сохранить пустой файл. Как я могу аутентифицировать процесс сохранения с помощью кнопки Сохранить, предварительно отключив его и включив после добавления записи?

Я всегда мог проверить, есть ли в текстовом поле запись, но я хочу сначала отключить кнопку и включить ее после добавления записи. У меня нет привилегии делать это сейчас.

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

private void tsmiSave_Click(object sender, EventArgs e)
{
    // Open sfdSaveToLocation which let us choose the
    // location where we want to save the file.
    if (txtDisplay.Text != string.Empty)
    {
        sfdSaveToLocation.ShowDialog();
    }
}

MainWindow.cs

using System;
using System.IO;
using System.Windows.Forms;

namespace Store_Passwords_and_Serial_Codes
{
    public partial class MainWindow : Form
    {
        private AuthenticateUser storedAuth;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void MainWindow_Load(object sender, EventArgs e)
        {
            // Prohibit editing.
            txtDisplay.Enabled = false;
        }

        public string ChangeTextBox
        {
            get
            {
                return this.txtDisplay.Text;
            }
            set
            {
                this.txtDisplay.Text = value;
            }
        }

        private void tsmiAuthenticate_Click(object sender, EventArgs e)
        {
            AuthenticationWindow authWindow = new AuthenticationWindow();
            authWindow.ShowDialog();
            storedAuth = authWindow.Result;
        }

        private void tsmiAddEntry_Click(object sender, EventArgs e)
        {
            if (storedAuth == null)
            {
                DialogResult result = MessageBox.Show
                    ("You must log in before you add an entry." 
                    + Environment.NewLine + "You want to authenticate?",
                    "Information", MessageBoxButtons.YesNo, 
                    MessageBoxIcon.Information);

                if (result == DialogResult.Yes)
                {
                    AuthenticationWindow authWindow = 
                        new AuthenticationWindow();
                    authWindow.ShowDialog();
                    storedAuth = authWindow.Result;

                    AddEntryWindow addWindow = new AddEntryWindow
                        (this, storedAuth.UserName, storedAuth.Password);
                    addWindow.ShowDialog();
                }
            }
            else
            {
                AddEntryWindow addWindow = new AddEntryWindow
                    (this, storedAuth.UserName, storedAuth.Password);
                addWindow.ShowDialog();
            }
        }

        private void tsmiClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void tsmiSave_Click(object sender, EventArgs e)
        {
            // Open sfdSaveToLocation which let us choose the
            // location where we want to save the file.
            sfdSaveToLocation.ShowDialog();
        }

        private void sfdSaveToLocation_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
        {
            string theFileName = sfdSaveToLocation.FileName;

            EncryptDecrypt en = new EncryptDecrypt();

            string encrypted = en.Encrypt(txtDisplay.Text,
                storedAuth.UserName, storedAuth.Password);

            MessageBox.Show(encrypted);

            File.WriteAllText(theFileName, encrypted);
        }
    }
}

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
    {
        string user, pass;

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

        // Initializing MainWindow form.
        MainWindow mainWindow;

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

        public AddEntryWindow(MainWindow viaParameter, string user, string pass)
            : this()
        {
            mainWindow = viaParameter;
            this.user = user;
            this.pass = pass;
        }

        private void AddEntryWindow_Load(object sender, EventArgs e)
        { }

        private void btnAddEntry_Click(object sender, EventArgs e)
        {
            // Making sure that type is selected.
            if (cmbType.SelectedIndex == -1)
            {
                MessageBox.Show("Please select entry type!", "Error!", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // Each field must be filled for specified type.
            // Here we are checking if all fields were filled.
            else if ((cmbType.SelectedIndex == 0 && (txtUserName.Text == string.Empty || txtPassword.Text == string.Empty)) ||
                (cmbType.SelectedIndex == 1 && (txtURL.Text == string.Empty || txtPassword.Text == string.Empty)) ||
                (cmbType.SelectedIndex == 2 && (txtSoftwareName.Text == string.Empty || txtSerialCode.Text == string.Empty)))
            {
                MessageBox.Show("Please fill all the fields!", "Error!", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                int totalEntries = 0;

                if(cmbType.SelectedIndex == 0)
                    addedEntry.Add(new AddPC(cmbType.Text, 
                        txtUserName.Text, txtPassword.Text));

                else if(cmbType.SelectedIndex == 1)
                    addedEntry.Add(new AddWebSite(cmbType.Text, 
                        txtUserName.Text, txtPassword.Text, txtURL.Text));

                else if(cmbType.SelectedIndex == 2)
                    addedEntry.Add(new AddSerialCode(cmbType.Text, 
                        txtSoftwareName.Text, txtSerialCode.Text));

                StringBuilder stringBuilder = new StringBuilder();

                foreach (var list in addedEntry)
                {
                    if (list is AddPC)
                    {
                        totalEntries++;
                        AddPC tmp = (AddPC)list;
                        stringBuilder.Append(tmp.ToString());
                    }
                    else if (list is AddWebSite)
                    {
                        totalEntries++;
                        AddWebSite tmp = (AddWebSite)list;
                        stringBuilder.Append(tmp.ToString());
                    }
                    else if (list is AddSerialCode)
                    {
                        totalEntries++;
                        AddSerialCode tmp = (AddSerialCode)list;
                        stringBuilder.Append(tmp.ToString());
                    }
                }

                mainWindow.ChangeTextBox = stringBuilder.ToString();

                mainWindow.tsslStatus.Text = "A total of " + totalEntries + " entries added.";

                // Clearing all fields.
                ClearFields();
            }
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            ClearFields();
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            // Closing the Add Entry Window form.
            this.Close();
        }

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

            // PC
            if (cmbType.SelectedIndex == 0)
            {}
            // Web Site
            else if (cmbType.SelectedIndex == 1)
            {}
            // Serial Code
            else if (cmbType.SelectedIndex == 2)
            {}
        }

        private void ClearFields()
        {
            // Clearing all fields to the default state.
        }
    }
}

Привет.

1 Ответ

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

Звучит так, как будто вы вероятно просто хотите подписаться на событие TextChanged, которое будет запускаться при изменении текста в текстовом поле.

Не могу сказать, что я действительно следил за всем, что вы делаете, но я думаю, что вы должны нормально просто включить или отключить кнопку Сохранить в этом обработчике событий.

РЕДАКТИРОВАТЬ: Не совсем понятно, где живут все ваши различные компоненты, но вы хотите что-то вроде:

// Put this after the InitializeComponent() call in the constructor.
txtDisplay.TextChanged += HandleTextBoxTextChanged;

...

private void HandleTextBoxTextChanged(object sender, EventArgs e)
{
    bool gotText = txtDisplay.Text.Length > 0;
    menuSaveButton.Enabled = gotText;
}

Я также настоятельно советую вам не использовать ArrayList, а использовать общий тип List<T>. Неуниверсальные коллекции почти никогда не должны использоваться в новом коде.

...