Я создаю словарь с = Значение тега и текст нескольких 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);
}
}
}
}
Я считаю, что хорошим решением является, во-первых, размещение вашего словаря в другом месте (например, личное в форме), и заполнение его при показе формы. Это позволит вам обновить словарь при изменении текстового поля.
Предполагая это, я создал бы один метод, который будет вызываться каждый раз, когда пользователь "покидает" окно редактирования и проверяет, изменился ли текст, и в каком случае я бы обновил словарь.
Таким образом, "отправить" нужно просто использовать словарь, который будет обновлен уже.
например:
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);
}
}
}
}