Как связать свойства элемента управления с переменными в C #? - PullRequest
2 голосов
/ 03 февраля 2010

У меня есть форма с большим количеством 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: На самом деле моя программа немного сложнее. У меня есть не только текстовые поля, но и флажки CheckBox, NumericUpDowns и т. Д. Также я хочу, чтобы в классе «Настройки» содержались некоторые дополнительные объекты, такие как списки.

Ответы [ 3 ]

1 голос
/ 13 февраля 2010

Обычно я решаю что-то вроде этого, используя привязки данных.

txtCrap1.DataBindings.Add("Text", Settings, "Crap1");
chkCrap2.DataBindings.Add("Checked", Settings, "Crap2");

Проблема, конечно, в запутывании.Но при запутывании вы можете исключить такие вещи, как целые классы, методы или свойства.Если возможно, вы можете исключить свойства класса Settings из обфускации и затем использовать обычные привязки данных.То, как вы исключите свойство, зависит от используемой вами структуры запутывания.

0 голосов
/ 03 февраля 2010

Создайте DataTable со столбцом для каждого TextBox, добавьте в него одну строку и используйте обычную привязку данных Windows Forms. Тогда просто относитесь к DataRow как к словарю.

0 голосов
/ 03 февраля 2010

Сделайте ваш 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...