因此,我使用Entity Framework根据数据库中的特定表生成控件,并且我也使用bindingNavigator。但是,有一个字符串应该在窗口上清晰可见,但是在数据库中已加密(我有加密和解密方法)。问题是:它将文本框的文本自动绑定到数据库中存储的内容(加密版本),在显示文本之前如何使用解密功能,并在保存时对字符串进行加密?
我首先找到了一种方法,每当我单击按钮以更改当前记录时,便会更改文本,而其他不良即席创作都以糟糕的代码结尾,但是使用数据绑定或其他方法不是更好的方法吗?对于我的应用程序的其他部分,我将需要类似的东西,因此,采用一种更简单(或至少更好)的方式将对您有很大的帮助。
感谢您的帮助。
您可以处理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();
}
}