Как заставить цикл for ждать ввода пользователя?

У меня есть цикл for, который переходит на сайт и отправляет сообщения в его формы. Для каждого элемента в listbox я хочу, чтобы он ждал, пока пользователь заполнит данные на сайте, а затем переместится. Ключевой момент здесь — «подождать».

Итак, мой вопрос: можно ли сделать цикл for для ожидания ввода пользователем?

Это цикл for, над которым я работаю, чтобы загрузить данные в формы:

if (webBrowser1.DocumentText.Contains("Welcome"))
{   
    for (int i = 0; i < listBox4.Items.Count; i++ )
    {

        listBox4.SetSelected(i, true);
        listBox5.SetSelected(i, true);
        //coded to submit to form

        Application.DoEvents();
    }
}

Это код для нажатия кнопки «Отправить» на сайте:

Application.DoEvents();
foreach (HtmlElement webpageelement in allelements)
{

     if (webpageelement.GetAttribute("value") == "Submit")
     {
         webpageelement.InvokeMember("click");
         Application.DoEvents();

     }

 }

Я также пытался сделать цикл for без кода, чтобы он продолжался. Например: i++ и сделайте оператор if, чтобы он продолжался, но это отставало от моего интерфейса.


person user1017524    schedule 28.10.2011    source источник
comment
Ваш вопрос действительно не ясен. Пожалуйста, объясните лучше, что вы делаете и что вы хотите сделать.   -  person Otiel    schedule 29.10.2011
comment
@Отиэль Хорошо. У меня есть список. В списке я могу добавлять к нему элементы. Для каждого элемента в списке моя программа переходит на сайт и заполняет его предопределенной информацией. Я хочу, чтобы программа ждала, пока пользователь заполнит капчу и нажмет кнопку отправки в моем интерфейсе, прежде чем цикл for перейдет к следующему элементу в списке.   -  person user1017524    schedule 29.10.2011
comment
Затем используйте решение, предложенное @HansPassant. Откройте новую форму, содержащую ваш браузер, используя Form.ShowDialog() в цикле for, и закройте эту форму, когда пользователь нажмет кнопку Submit. Ваш цикл for будет приостановлен до тех пор, пока пользователь не нажмет Submit.   -  person Otiel    schedule 29.10.2011
comment
Но что, если в списке будет несколько элементов. Будет ли открытие и закрытие каждый раз хорошим решением для пользователя и для компьютера?   -  person user1017524    schedule 29.10.2011
comment
Кроме того, я спрашивал на другом форуме, и кто-то рекомендовал использовать цикл do while. Будет ли это жизнеспособным решением, если я включу его в цикл for или мне следует придерживаться Form.ShowDialog?   -  person user1017524    schedule 29.10.2011
comment
И я не хочу использовать Form.ShowDialog, потому что хочу хранить все в одной форме:/   -  person user1017524    schedule 29.10.2011


Ответы (1)


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

Если вы не хотите использовать решение Form.ShowDialog(), предложенное в комментариях к вашему вопросу, вы можете придумать что-то вроде этого:

Имейте глобальную переменную, которая содержит индекс элемента listBox, над которым мы работаем:

int currentItemIndex;

Добавьте событие Click на кнопку Submit. Когда пользователь нажимает на Submit, вызывается метод, который будет обрабатывать следующий элемент listBox:

private void buttonSubmit_Click(Object sender, EventArgs e) {
    // Process next listBox item
    ProcessNextItem();
}

Метод, обрабатывающий следующий listBox элемент:

private void ProcessNextItem() {
    currentItemIndex += 1;
    if (currentItemIndex >= listBox.Items.Count) {
        // We have gone through all listBox items

        // Do nothing
    } else {
        // Fill predefined information to the website
        website.SomeField = listBox.Items[currentItemIndex].SomeField; // Whatever you do to fill predefined information
}

И вызовите метод в начале (пользователь не нажимает на Submit до обработки первого элемента listBox):

private void Start() {
    currentItemIndex = -1;
    ProcessNextItem();
}
person Otiel    schedule 28.10.2011