我有很多TextBoxes的表格,而且我的程序中有很多线程需要读取那些TextBoxes(设置)的内容。 由于我无法访问其他线程的控件,因此我决定创建将保存所有设置的特殊类,如果用户更改了某些设置,控件将调用OnTextChanged事件并更改类中的相应值。但是,如果我使用这种方法,那么就会有很多类似的处理程序。
private void txtCrap1_TextChanged(object sender, EventArgs e)
{
Settings.Crap1 = txtCrap1.Text;
}
我想做的是做这样的事情
private void SetUpControlBindings()
{
AddBinding(txtCrap1, Settings.Crap1);
AddBinding(txtCrap2, Settings.Crap2);
}
private void AddBinding(object control, object value)
{
//Add entry to some kind of dictionary
}
private void UpdateValue(object sender, EventArgs e)
{
if (sender is TextBox)
{
//Search it in dictionary and change appropriate value
}
}
但我在C#中找不到任何指向变量的指针 任何想法如何做到这一点?
P.S。我不能使用反射,因为我的代码在编译后会被混淆
UPD: 实际上我的程序有点复杂。我不仅有文本框,还有CheckBoxes,NumericUpDowns等。我也希望我的Settings类能够保存一些额外的对象,如Lists。
答案 0 :(得分:1)
我通常会解决类似问题的方法是使用数据绑定。
txtCrap1.DataBindings.Add("Text", Settings, "Crap1");
chkCrap2.DataBindings.Add("Checked", Settings, "Crap2");
问题当然是混淆。但是,当混淆时,你可以排除诸如整个类,方法或属性之类的东西。如果可能,您可以从混淆中排除Settings类的属性,然后能够使用普通数据绑定。如何排除属性取决于您使用的混淆框架。
答案 1 :(得分:0)
使Settings
对象由Dictionary<string, string>
支持,该对象将文本框的名称映射到其值。
例如:
readonly Dictionary<string, string> values = new Dictionary<string, string>();
public void AddBinding(TextBox box) {
box.Change += TextBox_Change;
values.Add(box.Name, box.Value);
}
void TextBox_Change(object sender, EventArgs e) {
var box = (TextBox)sender;
values[box.Name] = box.Value;
}
//Properties:
public string Prop1 { get { return values["textBox1"]; } }
//Where textBox1 is the name of the textbox
要在多个线程上使用此功能,您需要使用ReaderWriterLockSlim
。
答案 2 :(得分:0)
使用每个TextBox的列创建一个DataTable,向其添加一行,并使用常规的Windows Forms数据绑定。然后将DataRow视为字典。