Member 9770440 Ответов: 1

Как обновить значение текстового поля в цикле вычислений?


Я хочу показать изменение значения в текстовом поле для вычисления в цикле do..while. Я обнаружил, что текстовое поле показывает только конечное значение вычисления. Пожалуйста помочь. Спасибо!

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;

namespace Testprogram1
{        
    // Declare a delegate
    public delegate void ValueChangedEventHander(object sender, EventArgs ex);
    public partial class FrmMainW : Form
    {
        public FrmMainW()
        {
            InitializeComponent();
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            Add();
        }

        private void btnSub_Click(object sender, EventArgs e)
        {
            Sub();
        }

        private void btnAutoAdd_Click(object sender, EventArgs e)
        {
            do
            {
                Add();
            } while (num < 20000);
        }

        private void btnAutoSub_Click(object sender, EventArgs e)
        {
            do
            {
                Sub();
            } while (num > -20000);
        }

        private void Add()
        {
            num = num + 1;
            strnum = string.Format("{0:0.00}", num);
            TxtResult.Text = strnum;
        }
        private void Sub()
        {
            num = num - 1;
            strnum = string.Format("{0:0.00}", num);
            TxtResult.Text = strnum;
        }
    }
}

NotPolitcallyCorrect

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

1 Ответов

Рейтинг:
11

F-ES Sitecore

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

Приложение.Метод DoEvents (System.Окна.Формы)[^]

Лучшее решение-запустить ваши вычисления в отдельном потоке и использовать "Invoke" для обновления графического интерфейса из вашего отдельного потока, и таким образом графический интерфейс может свободно обновляться, пока ваш код работает в своем собственном потоке.


CPallini

Мой 5.

Member 9770440

Большое спасибо! Он работает с помощью приложения.DoEvent (). Я постараюсь использовать отдельный поток.