C # выход из цикла из отдельного класса / метода - PullRequest
0 голосов
/ 04 октября 2011

У меня есть блок кода, который повторяется с использованием цикла for, и каждый цикл создает форму для отображения некоторого текста. Некоторая вещь, такая как сокращенный код ниже.

Main()
{

For (int x: x<=20; x++)
{

createform(string[x]);
}

}

Таким образом, для каждого цикла передается отдельная строка в метод, который будет создавать форму, как показано ниже.

createform void (string input_)

{

...
code to build form and add a button "cancelbutton"
form.text = intput_
.... 
form.cancelbutton.Click += // and I want this to cause the original loop to end.... 

}

Нет, я знаю, что могу использовать кнопку, чтобы сделать int x больше 20, и это завершит цикл, но на самом деле я не знаю, каково будет максимальное значение, так как оно динамическое. Опять же, я мог бы решить это и сделать то же самое, но это кажется немного «грязным».

Есть ли более аккуратный способ заставить нажатие кнопки выйти из цикла. Как насчет того, если метод Createform находится в отдельном классе к main, это имеет какое-то значение?

Ответы [ 7 ]

3 голосов
/ 04 октября 2011

Если ваш цикл работает от 0 до 20 (или даже более 9000), пользователь не сможет вовремя нажать кнопку отмены. Фактически, поскольку все это в одном потоке, цикл завершится до того, как пользовательский интерфейс ответит на щелчок, но, возможно, я неправильно понял. Может быть, у вас есть логический флаг, который вы проверяете каждый раз при входе в цикл и устанавливаете его в false, когда пользователь нажимает кнопку?

2 голосов
/ 04 октября 2011

Просто добавьте переменную и закодируйте событие click:

static bool clicked;

Main()
{
clicked = false;
For (int x: (x<=20) && !clicked; x++)
{

createform(string[x]);
}

}

public static void Click_Detector(object sender, EventArgs e) {
  clicked = true;
}

Ваша процедура должна была бы сделать что-то вроде этого:

createform void (string input_)
{

...
code to build form and add a button "cancelbutton"
form.text = intput_
.... 
form.cancelbutton.Click += MainClass.Click_Detector;

}
1 голос
/ 04 октября 2011

Добавьте логическое значение в класс и установите в событии click логическое значение.Тогда вы можете выйти из цикла.Тем не менее, если вы используете приведенный выше вопрос в реальном мире, я бы согласился с ответом, данным mikerobi.

1 голос
/ 04 октября 2011

Ваш код psuedo не указывает, как вы показываете форму в CreateForm (). Это будет модальным или немодальным? Это должно быть модально, иначе вы просто продолжите создавать формы, пока коровы не вернутся домой. Помните, что добавление обработчика к кнопке щелчка фактически не выполняет метод обработчика до тех пор, пока не будет нажата кнопка щелчка.

Предположительно, ваш обработчик события click мог установить значение x больше 20, но, поскольку вы сказали, что не уверены, что это максимум, у вас может быть цикл do, управляемый логическим флагом, и ваш createform ( ) может установить состояние флага.

Я бы рекомендовал переосмыслить ваше проблемное пространство, так как этот общий подход кажется действительно запутанным. Я не понимаю ваш пользовательский интерфейс, но похоже, что вы намереваетесь заставить пользователя контролировать выход из бесконечного цикла, как те старые RPG, которые спрашивают вас «Хотите ли вы отправиться в приключение Да / Нет», и это будет продолжать спрашивать вас, пока вы не нажмете «Да». Это бессмысленно и запутанно.

1 голос
/ 04 октября 2011

Первое решение, которое приходит мне в голову: вернуть значение метода True / False и в foreach проверить его возвращаемое значение, если False => break.

1 голос
/ 04 октября 2011

Вы не должны использовать цикл для создания каждой формы. Предполагая, что у вас есть кнопка отправки. Каждый раз, когда пользователь нажимает кнопку «Отправить», вы должны явно показать следующую форму. Таким образом, если пользователь нажимает кнопку «Отмена», вам не нужно беспокоиться об остальных формах.

0 голосов
/ 04 октября 2011

Одним хорошим решением было бы использование метода CancelAsync () класса BackgroundWorker: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync.aspx

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

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