仅当WPF中的文本发生更改时,如何添加多个TextBox的标记值和文本值?

时间:2014-12-11 15:41:29

标签: c# wpf textbox buttonclick textchanged

单击“提交按钮”时,我在WPF应用程序中创建一个带有= Tag值的字典和多个TextBox的Text。我只想在字典中添加文本已更改的文本框的标记和文本 只有在文本发生变化时,如何添加多个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);
                 }
            }
       }
 }

1 个答案:

答案 0 :(得分:1)

我认为一个好的解决方案是,首先,将字典放在其他地方(表单中的私有),然后在显示表单时填充它。这将允许您在更改文本框时更新字典。

假设这样,我会创建一个单独的方法,每次用户&#34;离开&#34;编辑框,并检查文本是否更改,在这种情况下,我将更新字典。

这样,&#34;提交&#34;只需要使用已经更新的字典。

例如:

    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已经存在,前一代码将更新字典,并且与标签关联的文本与文本框中的文本不同,如果文本框中有文本且标签不是“已经在字典中了。

我假设&#34;标记&#34;存储在每个文本框的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);
        }
    }

在上面的代码中,如果文本为空,它也会从字典中删除。

修改

经过一番聊天,我们有更好的选择来完成你想做的事。

首先,将字典设为Form变量,就像上面的选项一样。

private Dictionary<string, string> fDic;

然后,当您填充TextBox时,为fDic中的每个文本框添加一个条目(带有TAG)。 为此,您可以使用以下代码:

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

当调用buttom 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);
             }
        }
    }
}