Merajuddin Ansari Ответов: 2

Динамический текст метки в цикле for


я использую веб-формы
I made a simple WF in C# in an attempt to change the label dynamically.

However, when I run this code, there is no visible change, until after the code has run, and then it changes to "Processing 9" 0-8 are not ever shown. Is it because it is within the loop?


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

private void button1_Click(object sender, EventArgs e)
   {
       for (int i = 0; i < 10; i++)
       {
           label9.Text = "Processing " + i.ToString();
           Thread.Sleep(1000);
       }
   }

2 Ответов

Рейтинг:
2

OriginalGriff

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

Есть способы получить то, что вы хотите - то есть метка меняется каждую секунду, - но именно то, как вы это делаете, зависит от среды, в которой вы работаете: например, решение WinForms будет отличаться от решения на основе веб-сайта. И есть разные способы сделать это, в зависимости от того, насколько сложным вы можете справиться и сколько плохого кода Вы можете терпеть.
Я собираюсь принять решение WinForms, и поскольку вы новичок, я также проигнорирую вариант "плохой код" по причинам, которые потребовалось бы слишком много времени, чтобы объяснить.
Это оставляет вам два варианта:
1) многопоточность.
2) таймер.

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

Удалите свой цикл.
Создайте целое число уровня класса, называемое count.

private int count = 0;

Добавьте экземпляр таймера уровня класса, называемый updateLabel
private System.Windows.Forms.Timer updateLabel = new System.Windows.Forms.Timer();

В событие click, добавьте этот код:
updateLabel.Interval = 1000;
updateLabel.Tick += updateLabel_Tick;
updateLabel.Start();

Теперь добавьте обработчик для события Tick:
void updateLabel_Tick(object sender, EventArgs e)
    {
    label1.Text = "Processing " + (++count).ToString();
    }

Запустите свой код.


Рейтинг:
0

Karthik_Mahalingam

попробуйте использовать Метод Window setInterval() [^]

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script>
        function doProcess() {
            var i = 0;
            var interval = window.setInterval(function () {
                document.getElementById('<%=lbl.ClientID%>').textContent = "Processing " +  i;
               i++;
               if (i >= 10)
                   clearInterval(interval);
           }, 1000);
       }

    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Label Text="" ID="lbl" runat="server" />
        <asp:Button Text="Submit" OnClientClick="doProcess();return false;" runat="server" />
    </form>
</body>
</html>