2015-09-06 4 views
1

У меня есть несколько текстовых полей, которые будут содержать номера, предоставленные пользователем. В нижней части всех текстовых полей я хотел бы иметь метку, которая будет содержать общую сумму всех чисел из текстовых полей выше. Никакая кнопка не понадобится, метка будет автоматически обновляться по мере ввода пользователем текстовых полей. Вот пример, который я заимствовал из Интернета.Автоматизация метки для получения суммы целых чисел из текстовых полей

http://tinypic.com/r/ev5ely/8

Обратите внимание на номера были обновлены автоматически без метода button_click. Любые предложения для достижения этого? Заранее спасибо!

+0

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

+0

Вот что я тоже думаю, но я не уверен, как его применять. @CharlesMager – Kayla

ответ

1

Сначала вам нужен групповой ящик и добавьте все связанные текстовые поля и метки в этот групповой ящик. Например, имя вашего группового ящика - Groupbox1.

Добавить TextChanged событие в текстовом поле либо вручную через свойства или программно, как показано ниже:

TextBox1.TextChanged += onTextChanged; 
TextBox2.TextChanged += onTextChanged; 
........... 
TextBoxN.TextChanged += onTextChanged; 

Сейчас в OnTextChanged случае,

protected void onTextChanged(object sender, EventArgs e){ 
    try{ 
      int sum = 0;//your sum 
      foreach (Control c in groupBox1.Controls)//iterate over each control insied groupbox 
      { 
       if (c as TextBox != null)//if controller is a textbox instance 
       { 
        sum += Convert.ToInt32(c.Text);//you can use float long or double datatype according to your need 
       } 
      } 
      Label1.Text = sum.ToString();//sum of the integers in all text boxes 
     } 
     catch(Exception ex){ 
      //your exception handling for num integer input goes here 
     } 
} 

Еще одна вещь,

+0

В случае пустого текстового поля или текстового поля с не численным содержимым вы должны обязательно обернуть только вызов Convert.ToInt32 в блоке 'try-ctach'. В вашем коде, если одно преобразование завершается с ошибкой, вся функция прерывается, даже если в них могут быть другие текстовые поля, оставшиеся с законными номерами –

+0

@MaximilianGerhardt, поэтому я завернул всю обработку событий в блок try-catch. – NZeta520

+0

Спасибо lot @ NZeta520! Это потрясающе! Вопрос, однако, для первой части, где вы упомянули textchanged, добавлю код 'TextBox1.TextChanged + = onTextChanged; 'к событию textchanged только для textbox1? Текстовое поле 2 будет иметь текстовое событие «TextBox2.TextChanged + = onTextChanged;» и т. Д.? Благодаря! – Kayla

0

Вы можете добавить обработчик события для управления двумя способами. 1. Во время разработки в окнах свойств можно найти событие, например «TextChanged», и в конечном итоге добавить обработчик событий «onTextChanged». 2. Во время выполнения, как я продемонстрировал ранее, textbox1.TextChanged + = OnTextChanged Однако, вы сделали что-то вроде этого

//this wrong and will not work at all 
private void textBox3_TextChanged(object sender, EventArgs e) 
{ 
    textBox3.TextChanged += onTextChanged; 
} 

Например, вы должны быть добавлены обработчик события «textBox2_TextChanged» на мероприятие «TextChanged» «textbox2». Интересно, что внутри этого обработчика событий вы добавили еще один обработчик событий «onTextChanged» для того же события. Обратите внимание на «+ =», что означает делегат многоадресной передачи (делегат, который включает несколько методов). Поэтому каждый раз, когда вы вводите что-то внутри текстовых полей, это событие будет вызываться, и в конце будет добавлено значение onTextChanged. В результате событие будет сложено из-за оператора «+ =». Поэтому в первый раз, когда вы вводите что-то в текстовое поле (для всех), ничего не произойдет, но в следующий раз, когда вы введете что-то, будут запущены ваши «textBox2_TextChanged» и «onTextChanged», и снова будет добавлено событие «onTextChanged» и так далее. Следовательно, это не идеальное место для назначения событий вашим элементам управления. Вы назначаете это событие где-то в другом месте, например FormLoad, который будет вызываться только один раз любой ценой во время инициализации формы. Кроме того, как я уже упоминал, вы можете назначать эти события в окнах свойств также во время разработки.

Смежные вопросы