Как применить функцию к связанному текстовому блоку с Windows формами? - PullRequest
0 голосов
/ 01 мая 2020

, поэтому я использую Entity Framework для генерации элементов управления в соответствии с определенной таблицей в базе данных, а также использую bindingNavigator. Однако есть одна строка, которая должна быть четко видна в окне, но зашифрована в базе данных (у меня есть методы шифрования и дешифрования). Проблема в том, что он автоматически связывает текст textBox с тем, что хранится в базе данных (зашифрованная версия), как я могу использовать функцию расшифровки перед отображением текста и шифровать строку при сохранении?

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

Заранее благодарен за вашу помощь.

1 Ответ

0 голосов
/ 01 мая 2020

Вы можете обрабатывать события Binding.Parse и Binding.Format для шифрования и дешифрования значения текстового поля.

Событие Format позволяет форматировать значение источника необработанных данных (расшифровать). Где-как событие Parse позволяет вам анализировать (шифровать) значение TextBox до значения, которое хранится в источнике данных.

В следующем примере это демонстрируется. Создайте новый проект WinForm и добавьте в форму BindingNavigator, TextBox и DatagridView. Затем измените код формы, включив в него следующий код. Для этого примера используется простое шифрование XOR. DatagridView используется для отображения зашифрованных исходных значений.

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Demo();
        }

        private DataTable dt = new DataTable();
        private BindingSource bs = new BindingSource();

        public void Demo()
        {
            dt.Columns.Add("Encrypted");
            dt.Rows.Add(Encrypt("Fred"));
            dt.Rows.Add(Encrypt("Barney"));
            bs.DataSource = dt;
            bindingNavigator1.BindingSource = bs;
            Binding b = textBox1.DataBindings.Add("Text", bs, "Encrypted", true);
            b.Parse += EncryptedParse;
            b.Format += EncryptedFormat;
            dataGridView1.DataSource = bs;
        }

        private void EncryptedFormat(object sender, ConvertEventArgs e)
        {
            e.Value = Decrypt((string)(e.Value));
        }

        private void EncryptedParse(object sender, ConvertEventArgs e)
        {
            e.Value = Encrypt((string)(e.Value));
        }

        private string Encrypt(string s)
        {
                StringBuilder sb = new StringBuilder(s.Length);
                foreach (char c in s)
                {
                    sb.Append((char)(c ^ 2));
                }
                return sb.ToString();
            }

        private string Decrypt(string s)
        {
            StringBuilder sb = new StringBuilder(s.Length);
            foreach (char c in s)
            {
                sb.Append((char)(c ^ 2));
            }
            return sb.ToString();
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...