如何将控件的属性绑定到C#中的变量?

时间:2010-02-03 15:04:19

标签: c# forms pointers

我有很多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。

3 个答案:

答案 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视为字典。