Как добавить значение тега и текстовое значение нескольких TextBox, только если текст изменился в WPF?

1

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

 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.
  • 0
    Я пытался добавить обработчик событий TextChanged для каждого из TextBox, но я не уверен, как именно это проверить, когда происходит событие SubmitButton. Есть ли у вас какие-либо идеи, что я могу поставить в утверждении «Если» выше, чтобы проверить это?
Теги:
wpf
textbox
buttonclick
textchanged

1 ответ

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" хранится в свойстве 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);
        }
    }

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

РЕДАКТИРОВАТЬ

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

Во-первых, сделайте словарь переменной формы, как в приведенном выше варианте.

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;
    }

Когда вызывается событие clicktom click, просто сравните текст в текстовых полях с ранее сохраненным в 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 должен найти его.
  • 1
    Каждый раз, когда вы нажимаете клавишу и ИЗМЕНИТЕ текст в текстовом поле, событие TextChanged будет запущено. В конце концов, пользователь может оставить текст как оригинал, и вы будете что-то делать каждый раз. Если вы разрешите проверку только до того момента, когда пользователь «оставит» код, это будет сделано только один раз.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню