如何使用Windows窗体将功能应用于绑定的文本框?

问题描述 投票:0回答:1

因此,我使用Entity Framework根据数据库中的特定表生成控件,并且我也使用bindingNavigator。但是,有一个字符串应该在窗口上清晰可见,但是在数据库中已加密(我有加密和解密方法)。问题是:它将文本框的文本自动绑定到数据库中存储的内容(加密版本),在显示文本之前如何使用解密功能,并在保存时对字符串进行加密?

我首先找到了一种方法,每当我单击按钮以更改当前记录时,便会更改文本,而其他不良即席创作都以糟糕的代码结尾,但是使用数据绑定或其他方法不是更好的方法吗?对于我的应用程序的其他部分,我将需要类似的东西,因此,采用一种更简单(或至少更好)的方式将对您有很大的帮助。

感谢您的帮助。

c# winforms entity-framework data-binding
1个回答
0
投票

您可以处理Binding.ParseBinding.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();
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.