Маркировка обновления при обработке в Windows Forms

Используйте document.getElementsByClassName('number')[0].remove(); (с индексом в циклах или прототипом forEach()) для динамического удаления элементов.

Обновленный цикл из вашего кода будет выглядеть следующим образом:

for (i = 0; i < number.length; i++) {
    // keep using index 0 as the DOM array becomes smaller as you remove the element
    english[0].remove(); 
}

Или, если вы используете ES6, вы можете использовать Array.from(), чтобы превратить NodeList в массив, а затем использовать forEach(): [ 119]

Array.from(english).forEach(element => {
    element.remove();
});
32
задан default locale 9 June 2015 в 10:28
поделиться

4 ответа

Быстрое исправление для Вас было бы:

Label1.Text = f.Name + " is done processing, now processing...";
Label1.Refresh();

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

61
ответ дан casperOne 27 November 2019 в 20:01
поделиться

Вы должны сделать это на другом потоке и затем обновить Ваш поток UI от того потока. Вы блокируете последующую обработку путем выполнения этой работы над потоком UI.

, Если Вы не можете перемещение этот код к потоку UI, затем Вы могли всегда звонить Application.DoEvents , но я сильно предлагаю, чтобы Вы исследовали эти опции сначала:

13
ответ дан casperOne 27 November 2019 в 20:01
поделиться

Необходимо будет получить данные от одного потока до другого. Это может быть сделано несколькими способами...

Первый, Ваш "фоновый" поток мог обновить некоторую строковую переменную "CurrentStatus", которую он изменяет, как он продвигается. Вы могли затем поместить таймер на свою форму, которая затем захватит переменную CurrentStatus и обновит маркировку с ним.

114-секундный, Вы могли просто вызвать операцию от фонового потока до потока UI с делегатом, использующим свойство InvokeRequired элемента управления "метка". Так, например...

private delegate void UpdateStatusDelegate(string status);
private void UpdateStatus(string status)
{
    if (this.label1.InvokeRequired)
    {
        this.Invoke(new UpdateStatusDelegate(this.UpdateStatus), new object[] { status });
        return;
    }

    this.label1.Text = status;
}

можно назвать тот UpdateStatus () методом от любого потока (UI или фон), и он обнаружит, должен ли он вызвать операцию на основной поток UI (и если так, делает это).

Для фактической установки потока можно сделать так как это:

    private void StartProcessing()
    {
        System.Threading.Thread procThread = new System.Threading.Thread(this.Process);

        procThread.Start();
    }

    private void Process() // This is the actual method of the thread
    {
        foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
        {
            // Do processing
            // Show progress bar
            // Update Label on Form, "f.Name is done processing, now processing..."
            UpdateStatus("Processing " + f.Name + "...");                
        }
    }

Затем, когда пользователь нажмет кнопку "GO", Вы просто назовете StartProcessing ().

13
ответ дан Peter Mortensen 27 November 2019 в 20:01
поделиться

Если Ваша обработка долга, делают это в потоке backgroundworker.

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

1
ответ дан devSpeed 27 November 2019 в 20:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: