2014-12-11 5 views
1

Я создаю словарь с = Значение тега и текст нескольких TextBox в приложении WPF, когда нажата кнопка «Отправить кнопку». Я только хочу добавить в словарь тег и текст текстовых полей, где текст был изменен.
Как добавить значение тега и текстовое значение нескольких TextBox, только когда текст был изменен? код ниже, что я до сих пор, но я застрял:.Как добавить значение тега и текстовое значение нескольких TextBox, только когда текст был изменен в WPF?

private void Submit_Button_Click(object sender, RoutedEventArgs e) 
{ 
     Dictionary<string, string> tagDict = new Dictionary<string, string>(); 
     foreach(Control ctrl in MainGrid.Children) 
     { 
      if (ctrl.GetType() == typeof(textBox)) 
      { 
       TextBox tb = ctrl as TextBox; 
       if (//I am trying to get a value that represents that the Text has changed here 
        ) 
       { 
        string tagString = tb.Tag.ToString(); 
        string textString = tb.Text; 
        tagDict.Add(tagString, textString); 
       } 
      } 
     } 
} 
+0

Используйте событие TextChanged, чтобы обнаружить изменение TextBox. – Maximus

+0

Я попытался добавить обработчик событий TextChanged в каждый из TextBox, но я точно не знаю, как это проверить, когда происходит событие SubmitButton. Есть ли у вас какие-либо представления о том, что я могу добавить в вышеприведенное заявление «Если», чтобы проверить это? – antman1p

ответ

1

Я думаю, что это хорошее решение, во-первых, чтобы поставить словарь где-нибудь еще (частное в виде, может быть), и заполнить его при показе формы. Это позволит вам обновить словарь при изменении текстового поля.

Предполагая это, я бы создал единый метод, который будет вызываться каждый раз, когда пользователь «покидает» поле редактирования и проверяет, был ли текст изменен, и в каком случае я бы обновил словарь.

Таким образом, «отправить» нужно просто использовать словарь, который будет обновлен уже.

например:

private Dictionary<string, string> fDic; //This must be instantiated in the initialization 

    //Add this method to every Leave event in all text box controls. 
    private void textBox_Leave(object sender, EventArgs e) 
    { 
     TextBox text = sender as TextBox; 
     //Check if the text changed 
     if (text != null) 
     { 
      if (fDic.ContainsKey((string)text.Tag)) 
      { 
       if (fDic[(string)text.Tag] != text.Text) 
        fDic[(string)text.Tag] = text.Text; 
      } 
      else if(text.Text != null) 
      { 
       fDic[(string)text.Tag] = text.Text; 
      } 
     } 
    } 

Прежний код будет обновлять словарь, если TAG уже есть и текст, связанный с тегом отличается от текста в текстовом поле, и если есть текст в текстовое поле и тег уже не находятся в словаре.

Я предполагаю, что «Тег» хранится в свойстве Tag каждого текстового поля. Кроме того, он будет хранить строки, состоящие из только пробелов. Если вы не хотите этого, то код может быть изменен на:

private Dictionary<string, string> fDic; //This must be instantiated in the initialization 

    //Add this method to every Leave event in all text box controls. 
    private void textBox_Leave(object sender, EventArgs e) 
    { 
     TextBox text = sender as TextBox; 
     //Check if the text changed 
     if (text != null) 
     { 
      if (fDic.ContainsKey((string)text.Tag)) 
      { 
       if (fDic[(string)text.Tag] != text.Text && !string.IsNullOrWhiteSpace(text.Text)) 
        fDic[(string)text.Tag] = text.Text; 
      } 
      else if(!string.IsNullOrWhiteSpace(text.Text) != null) 
      { 
       fDic[(string)text.Tag] = text.Text; 
      } 
      else if (string.IsNullOrWhiteSpace(text.Text) 
       fDic.Remove((string)text.Tag); 
     } 
    } 

В коде выше, он также будет удалить из словаря, если текст пуст.

EDIT

Через какое-то общение, мы пришли с более лучший вариант, чтобы сделать то, что вы хотите сделать.

Прежде всего, сделайте словарь переменной формы, как в приведенной выше опции.

private Dictionary<string, string> fDic; 

Затем, когда вы заселить TextBox, положил одну запись (с TAG) для каждого текстового поля в FDIC. Чтобы сделать это, вы можете использовать этот код:

foreach(Control ctrl in MainGrid.Children) 
    { 
     TextBox tb = ctrl as TextBox; 
     if (tb != null) 
      fDic[(string)text.Tag] = text.Text; 
    } 

Когда событие днища нажмите называется, просто сравнить текст в текстовых полях с СВОИМ ранее сохраненным в DIC, используя словарь, чтобы сделать это.

private void Submit_Button_Click(object sender, RoutedEventArgs e) 
{ 
    Dictionary<string, string> tagDict = new Dictionary<string, string>(); 
    foreach(Control ctrl in MainGrid.Children) 
    {  
     TextBox tb = ctrl as TextBox; 
     if (tb != null) 
     { 
      if (fDic[(string)text.Tag] != text.Text) 
      { 
       string tagString = tb.Tag.ToString(); 
       string textString = tb.Text; 
       tagDict.Add(tagString, textString); 
      } 
     } 
    } 
} 
+0

Но как я могу проверить, изменился ли текст? Это все равно будет проблемой, с которой я столкнулся. Я предполагаю, что есть что-то, что мне нужно сделать с обработчиком событий TextChanged, и вышеприведенный оператор if должен найти его. – antman1p

+1

Каждый раз, когда вы нажимаете клавишу и CHANGE текст в текстовом поле, событие TextChanged будет срабатывать. В конце концов, пользователь может позволить тексту как оригиналу, и вы будете делать что-то каждый раз. Если вы позволите проверке только тогда, когда пользователь «покинет» код, это будет сделано только один раз. – Jauch

+0

Я добавлю код для ответа, чтобы показать, как вы можете проверить, изменился ли текст. – Jauch