Как передать целочисленное значение из 5 разных текстовых полей в 2 разных текстовых поля - PullRequest
1 голос
/ 22 сентября 2019

У меня есть приложение Winforms, которое имеет несколько кнопок.Это требует от пользователя нажатия кнопки, сколько бы раз ему это ни понадобилось, тогда событие нажатия кнопки button1 добавляет целое значение в textbox1, которое увеличивается с каждым нажатием кнопки button1.И затем у меня есть button2, который при нажатии вычитает из целочисленного значения внутри textbox1.

Теперь у меня также есть textbox2, textbox3, textbox4, textbox5 и textbox6, которые делают то же самое, каждый со своей парой кнопок для добавленияи вычесть.все они работают независимо друг от друга.Txtbox1,2,3,4,5,6 являются отправителями.

Моя проблема возникает, когда я пытаюсь получить целочисленное значение внутри txtbox1, txtbox2, txtbox3, txtbox4, txtbox5 и txtbox6 передать на txtbox7 и txtbox8, которыеявляются txtboxes получения.Каждый из этих текстовых полей также имеет две кнопки, которые добавляют значения и вычитают значения.Я могу получить txtbox1 передать значения на txtbox7 и txtbox8 без проблем.Проблема начинается, когда я использую тот же код, чтобы все другие txtboxes передали значение int в txtbox7 & txtbox8, входные данные из одного из 6 txtboxes будут перезаписывать друг друга.

например, если я нажму 5 раз наtxtbox1 передает int 5 на txtbox1, txtbox7 & txtbox8, но если затем я иду и нажимаю 2 раза на txtbox2, то txtbox7 & 8 значение 5 не исчезает, и вместо него отображается новое значение 2.Я хочу, чтобы при нажатии на любую из этих кнопок значение, которое передается во 2 принимающие txtbox, необходимо добавить к значению int, которое уже было там.Я не знаю, достаточно ли это объяснительно.Это мой код.

private void button1Add_Click(object sender, EventArgs e)
{
  AddToTexBox1(1);
}

private void AddToTextBox1(int changeBy)
{
  if (int.TryParse(txtBox1.Text, out int value))
  {
     value += changeBy;
     txtBox1.Text = value.ToString();
     txtBox7.Text = value.ToString();
     txtBox8.Text = value.ToString();
  }
  else
  {
     MessageBox.Show("Invalid Integer in TextBox!");
  }

}

private void Btn2Subtract_Click(object sender, EventArgs e)
{
     AddToTextBox1(-1);
}

Этот код отлично работает для txtBox 1 и txtBox7 & txtBox8, но когда я пытаюсь использовать то же самое для других txtBox, он не работает должным образом.Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 22 сентября 2019

Ваша жизнь была бы намного проще, если бы вы использовали элементы управления NumericUpDown вместо текстовых полей.Вы можете установить для всех ваших NUD значение по умолчанию 0, написать для них один обработчик события, измененного значением (связать все события изменения значения NUD с одним и тем же обработчиком), который имеет одну строку кода:

nud7.Value = nud1.Value + nud2.Value + nud3.Value ...

Если бы вы поместили nud1 в nud6 в массив класса в конструкторе, вы могли бы даже использовать LINQ, чтобы упростить это до:

nud7.Value = myNuds.Sum(n => n.Value);

Вот шаг за шагом - сделайте это в новомпроект.Это займет около 10 минут:

  • создайте новое приложение для оконных форм
  • перетащите 8 чисел вверх или вниз на форму
  • выберите их все, установите их минимальное значение изначение 0, установите максимальное значение на что-то релевантное
  • выберите только первые 6
  • перейдите в таблицу свойств, щелкните молнию, найдите событие, которое относится к измененному значению (вероятно, называетсяValueChanged, я сейчас не на компьютере, чтобы тестировать), и напишите «AllChanged» в поле рядом с ним, нажмите return.
  • появится представление кода.Поместите первый код, который я опубликовал (тот, который добавляет все значения и сохраняет результат в числовом обновлении 7's Value) в обработчик событий
  • Запустите проект

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

Будьте осторожны, чтобы не добавить тот же обработчик событий в блок 7;Вы будете вызывать бесконечный цикл, который переполнит стек

1 голос
/ 22 сентября 2019

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

txtBox7.Text = value.ToString();

Вы не проверяете значение, хранящееся в настоящее время в txtBox7 .

Таким образом, вы можете выполнить 2 пути для его решения:

  1. Используйте тот же синтаксический анализ для int, чтобы получить значение из вашего txtBox7 и поместить его в переменную, затем добавить значение в эту переменную и только затем сохранить его обратно в цельTextBox.

  2. У вас может быть какая-то модель за вашей логикой (в случае, если эти числа представляют что-то) и обновление модели (путем помещения чисел в свойства модели в соответствии с вашими "бизнес-правилами").После этого вы синхронизируете свой пользовательский интерфейс (TextBoxes) с моделью, помещая значения из модели в TextBoxes.В идеале вы хотели бы использовать привязку данных для него (чтобы ваш интерфейс обновлялся автоматически после изменения модели).

Вот пример кода для 1.:

if (int.TryParse(txtBox1.Text, out int value) &&
    int.TryParse(txtBox7.Text, out int oldValue7) &&
    int.TryParse(txtBox7.Text, out int oldValue8)
    )
{
    value += changeBy;
    oldValue7 += value;
    oldValue8 += value;
    txtBox1.Text = value.ToString();
    txtBox7.Text = oldValue7.ToString();
    txtBox8.Text = oldValue8.ToString();
}

Если вам нужна дополнительная информация о привязке данных, см. документацию .Вам придется потратить время на изучение и привыкание к этому подходу, но это позволит вам отделить логику модели от пользовательского интерфейса, что полезно для сложных моделей и пользовательских интерфейсов.

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

class MyModel
{
  public int MyFirstInputValue {get; set;}
  public int MySecondInputValue {get; set;}

  public int MyFirstResultValue {get; private set;}
  public int MySecondResultValue {get; private set;}

  public void RunMyCalculationLogic()
  {
    // your calculations go here...
    MyFirstResultValue = MyFirstInputValue + MySecondInputValue;
    MySecondResultValue = MyFirstInputValue - MySecondInputValue;
  }
}

Затем вы используете эту модель более или менее так:

var myModel = new MyModel();
myModel.MyFirstInputValue = 1; // parse value from input textBox1
myModel.MySecondInputValue = 2; // parse value from input textBox2
myModel.RunMyCalculationLogic();
// TODO: use results from MyFirstResultValue and MySecondResultValue to populate textBoxes you need

Надеюсь, вам этого достаточно, чтобы получитьначал.

0 голосов
/ 23 сентября 2019

После игры с некоторым кодом, который я использовал в другом проекте Winforms, который у меня был.Я нашел решение своей проблемы.Это то, что я сделал.


       TextBox[] txtbox;


        public FormOne()
        {
            InitializeComponent();



            Sqlconn con = new Sqlconn();

            txtbox = new TextBox[] { txtBox1, txtBox2, txtBox3, txtBox4, txtBox5, txtBox6, txtBox7};

            foreach (TextBox text in txtbox)
                text.TextChanged += new EventHandler(txtbox_TextChanged);

           }

           private void txtbox_TextChanged(object sender, EventArgs e)
        {
            int value = 0;
            int total = 0;
            foreach (TextBox text in txtbox)
            {
                if (int.TryParse(text.Text, out value))
                    total += value;
            }
            txtBox7.Text = total.ToString();
            txtBox8.Text = total.ToString();

            private void FormOne_Load(object sender, EventArgs e)
            {

            }

Спасибо всем за поддержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...