С windows forms цикл

Порядок событий в формах Windows Forms Order of Events in Windows Forms

Особый интерес для разработчиков представляет порядок, в котором вызываются события в приложениях Windows Forms, для обеспечения обработки каждого из этих событий в свою очередь. The order in which events are raised in Windows Forms applications is of particular interest to developers concerned with handling each of these events in turn. Если ситуация требует аккуратной обработки событий, например когда производится перерисовка части формы, то необходимо знать точный порядок, в котором вызываются события во время выполнения. When a situation calls for meticulous handling of events, such as when you are redrawing parts of the form, an awareness of the precise order in which events are raised at run time is necessary. В этом разделе приведены некоторые сведения о порядке событий, возникающих на нескольких важных этапах жизненного цикла приложений и элементов управления. This topic provides some details on the order of events during several important stages in the lifetime of applications and controls. Конкретные сведения о порядке событий ввода мыши см. в разделе события мыши в Windows Forms. For specific details about the order of mouse input events, see Mouse Events in Windows Forms. Общие сведения о событиях в Windows Forms см. в разделе Общие сведения о событиях. For an overview of events in Windows Forms, see Events Overview. Дополнительные сведения о описывающего обработчиков событий см. в разделе Общие сведения об обработчиках событий. For details about the makeup of event handlers, see Event Handlers Overview.

События запуска и завершения работы приложения Application Startup and Shutdown Events

Классы Form и Control предоставляют набор событий, связанных с запуском и завершением приложения. The Form and Control classes expose a set of events related to application startup and shutdown. При запуске приложения Windows Forms события запуска главной формы вызываются в следующем порядке: When a Windows Forms application starts, the startup events of the main form are raised in the following order:

При закрытии приложения события запуска главной формы вызываются в следующем порядке: When an application closes, the shutdown events of the main form are raised in the following order:

Событие ApplicationExit класса Application вызывается после событий завершения работы основной формы. The ApplicationExit event of the Application class is raised after the shutdown events of the main form.

В Visual Basic 2005 содержатся дополнительные события приложений, такие как WindowsFormsApplicationBase.Startup и WindowsFormsApplicationBase.Shutdown. Visual Basic 2005 includes additional application events, such as WindowsFormsApplicationBase.Startup and WindowsFormsApplicationBase.Shutdown.

События, связанные с фокусом и проверками Focus and Validation Events

При изменении фокуса с помощью клавиатуры (при нажатии клавиш TAB, SHIFT+TAB и так далее), путем вызова методов Select или SelectNextControl, либо присвоением свойства ActiveControl текущей форме, события фокуса ввода класса Control происходят в следующем порядке: When you change the focus by using the keyboard (TAB, SHIFT+TAB, and so on), by calling the Select or SelectNextControl methods, or by setting the ActiveControl property to the current form, focus events of the Control class occur in the following order:

При изменении фокуса ввода с помощью мыши или путем вызова метода Focus события фокуса класса Control происходят в следующем порядке. When you change the focus by using the mouse or by calling the Focus method, focus events of the Control class occur in the following order:

WinForm и циклы

У меня установлена ​​WinForm и процесс, который повторяется до тех пор, пока на форме не будет нажата кнопка.

Когда я пытаюсь запустить свой код, форма даже не отображается. Я подозреваю, что это потому, что код застревает в цикле и не достаточно далеко, чтобы отобразить WinForm. Как получить форму для отображения и цикл после этой точки?

7 ответов

Если вы зацикливаетесь, потому что вам нужно периодически что-то делать с графическим интерфейсом в ожидании ввода, я предлагаю использовать Timer контроль и его Tick событие

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

Вы, вероятно, должны запустить цикл в фоновом потоке. Класс BackgroundWorker делает это довольно легко.

Загрузка формы замораживается, потому что пользовательский интерфейс формы Windows выполняется в одном потоке. И логика, которую вы помещаете в событие Load этой формы, работает в этом потоке.

Вы можете легко запустить цикл в отдельном потоке, используя компонент BackgroundWorker в форме Windows. На событие DoWork вашего фонового работника вы помещаете код с циклом, который должен выполняться без блокировки вашего пользовательского интерфейса. В событии Form.Load вы можете запустить компонент фонового рабочего процесса, вызвав метод RunWorkerAsync. В обработчике событий вашей кнопки вы помещаете код для остановки фонового работника, вызывая метод CancelAsync.

О вашем комментарии о невозможности обновления текста TextBox из вашего фонового рабочего компонента. Это происходит потому, что не разрешено изменять состояние элемента управления Windows Form из другого потока (ваш фоновый рабочий код выполняется в отдельном потоке) Документация MSDN гласит:

Доступ к элементам управления Windows Forms не является поточно-ориентированным. Если у вас есть два или более потоков, управляющих состоянием элемента управления, можно перевести элемент управления в несогласованное состояние. Возможны другие связанные с потоками ошибки, такие как состояние гонки и взаимоблокировки. Важно убедиться, что доступ к вашим элементам управления выполняется потокобезопасным способом.

Пример того, как вы можете обновить состояние элементов управления Windows-форм из фонового потока, будет аналогичен приведенному ниже (при условии, что новое значение уже сохранено в строковой переменной с именем text):

Читайте также:  Не могу запустить службу защитника windows

Я позаимствовал этот код из статьи Как сделать потокобезопасные вызовы в элементы управления Windows Forms. Он может предоставить вам больше информации о том, как работать с многопоточными формами окон.

Изучение условной логики с операторами ветви и цикла Learn conditional logic with branch and loop statements

В этом руководстве объясняется, как написать код, который позволяет проверить переменные и изменить путь выполнения на основе этих переменных. This tutorial teaches you how to write code that examines variables and changes the execution path based on those variables. Вы напишете код C# и сможете просмотреть результаты его компиляции и выполнения. You write C# code and see the results of compiling and running it. Это руководство содержит ряд уроков, в которых рассматриваются конструкции ветвления и циклов в C#. The tutorial contains a series of lessons that explore branching and looping constructs in C#. В рамках этих занятий вы ознакомитесь с основами языка C#. These lessons teach you the fundamentals of the C# language.

Предварительные требования Prerequisites

Для работы с руководством вам потребуется компьютер, настроенный для разработки в локальной среде. The tutorial expects that you have a machine set up for local development. В Windows, Linux или macOS для создания, сборки и запуска приложений можно использовать .NET CLI. On Windows, Linux, or macOS, you can use the .NET CLI to create, build, and run applications. Для Mac и Windows можно использовать Visual Studio 2019. On Mac and Windows, you can use Visual Studio 2019. Инструкции по настройке см. в статье Настройка локальной среды. For setup instructions, see Set up your local environment.

Принятие решений с помощью оператора if Make decisions using the if statement

Создайте каталог с именем branches-tutorial. Create a directory named branches-tutorial. Сделайте его текущим, выполнив следующую команду: Make that the current directory and run the following command:

Эта команда создает консольное приложение .NET в текущем каталоге. This command creates a new .NET console application in the current directory. Откройте файл Program.cs в любом редакторе и замените содержимое следующим кодом: Open Program.cs in your favorite editor, and replace the contents with the following code:

Чтобы выполнить этот код, введите dotnet run в окне консоли. Try this code by typing dotnet run in your console window. В консоли должно появиться сообщение The answer is greater than 10 You should see the message «The answer is greater than 10.» (Ответ больше 10). printed to your console. Измените объявление b , чтобы сумма была меньше 10: Modify the declaration of b so that the sum is less than 10:

Введите dotnet run еще раз. Type dotnet run again. Так как ответ меньше 10, никакие данные не выводятся. Because the answer is less than 10, nothing is printed. Проверяемое условие имеет значение false. The condition you’re testing is false. У вас еще нет кода для выполнения, так как вы написали только одну из возможных ветвей для оператора if — ветвь true. You don’t have any code to execute because you’ve only written one of the possible branches for an if statement: the true branch.

Вероятнее всего, при изучении C# (как и любого другого языка программирования) вы будете допускать ошибки в коде. As you explore C# (or any programming language), you’ll make mistakes when you write code. Компилятор найдет ошибки и сообщит о них. The compiler will find and report the errors. Внимательно просмотрите выходные данные ошибки и код, вызвавший ошибку. Look closely at the error output and the code that generated the error. Как правило, сведения о причине ошибки можно найти в сообщении об ошибке компилятора. The compiler error can usually help you find the problem.

В первом примере показаны возможности if и логические типы. This first sample shows the power of if and Boolean types. Логическое значение — это переменная, которая может иметь одно из двух значений: true или false . A Boolean is a variable that can have one of two values: true or false . Логические переменные в C# определяются особым типом — bool . C# defines a special type, bool for Boolean variables. Оператор if проверяет значение bool . The if statement checks the value of a bool . Если значение true , выполняется оператор, следующий после if . When the value is true , the statement following the if executes. В противном случае он пропускается. Otherwise, it’s skipped. Этот процесс проверки условий и выполнения операторов на основе этих условий предоставляет широкие возможности. This process of checking conditions and executing statements based on those conditions is powerful.

Объединение операторов if и else Make if and else work together

Чтобы выполнить разный код в ветвях true и false, создайте ветвь else , которая будет выполняться, если условие имеет значение false. To execute different code in both the true and false branches, you create an else branch that executes when the condition is false. Попробуйте создать ветвь else . Try an else branch. Добавьте две последние строки из приведенного ниже кода (первые четыре должны быть уже добавлены): Add the last two lines in the code below (you should already have the first four):

Оператор после ключевого слова else выполняется, только если проверяемое условие имеет значение false . The statement following the else keyword executes only when the condition being tested is false . Объединив операторы if и else с логическими условиями, вы получите все необходимые возможности для обработки условий true и false . Combining if and else with Boolean conditions provides all the power you need to handle both a true and a false condition.

Отступы под операторами if и else предназначены только для удобства чтения. The indentation under the if and else statements is for human readers. В языке C# необязательно ставить отступы или пробелы. The C# language doesn’t treat indentation or white space as significant. Операторы после ключевого слова if или else будут выполняться на основе условия. The statement following the if or else keyword will be executed based on the condition. Во всех строках в примерах кода, представленных в этом руководстве, отступы традиционно соответствуют потоку управления операторов. All the samples in this tutorial follow a common practice to indent lines based on the control flow of statements.

Читайте также:  Windows logged on user remote

Так как отступ не обязателен, используйте скобки < и >, если нужно указать несколько операторов в блоке кода, который выполняется в зависимости от условий. Because indentation isn’t significant, you need to use < and >to indicate when you want more than one statement to be part of the block that executes conditionally. Программисты C# обычно используют эти фигурные скобки во всех предложениях if и else . C# programmers typically use those braces on all if and else clauses. Следующий пример аналогичен тому, который вы создали. The following example is the same as the one you created. Измените код выше, чтобы он соответствовал следующему коду: Modify your code above to match the following code:

Все примеры кода в следующих разделах руководства содержат фигурные скобки в соответствии с принятой практикой. Through the rest of this tutorial, the code samples all include the braces, following accepted practices.

Можно проверить более сложные условия. You can test more complicated conditions. Добавьте следующий код после написанного кода: Add the following code after the code you’ve written so far:

Символ == позволяет проверить равенство. The == symbol tests for equality. С помощью == обозначается отличие проверки равенства от назначения, которое показано в a = 5 . Using == distinguishes the test for equality from assignment, which you saw in a = 5 .

&& представляет оператор and. The && represents «and». То есть для выполнения оператора в ветви true оба условия должны иметь значение true. It means both conditions must be true to execute the statement in the true branch. В этих примерах также показано, что в каждой условной ветви можно задать несколько операторов. Нужно лишь заключить их в скобки < и >. These examples also show that you can have multiple statements in each conditional branch, provided you enclose them in < and >. Вы также можете использовать оператор || , который представляет оператор or. You can also use || to represent «or». Добавьте следующий фрагмент после написанного кода: Add the following code after what you’ve written so far:

Измените значения a , b и c , а также переключитесь между && и || для изучения. Modify the values of a , b , and c and switch between && and || to explore. Так вы лучше поймете, как работают операторы && и || . You’ll gain more understanding of how the && and || operators work.

Вы завершили первый этап. You’ve finished the first step. Прежде чем перейти к следующему разделу, переместим текущий код в отдельный метод. Before you start the next section, let’s move the current code into a separate method. Это упростит начало работы с новым примером. That makes it easier to start working with a new example. Поместите существующий код в метод ExploreIf() . Put the existing code in a method called ExploreIf() . Вызовите этот метод в начале программы. Call it from the top of your program. После внесения этих изменений код должен выглядеть так: When you finished those changes, your code should look like the following:

Закомментируйте вызов ExploreIf() . Comment out the call to ExploreIf() . Это поможет упорядочить выходные данные в этом разделе. It will make the output less cluttered as you work in this section:

// запускает комментарий в C#. The // starts a comment in C#. Комментарии — это любой текст, который должен быть сохранен в исходном коде, но не должен выполняться как код. Comments are any text you want to keep in your source code but not execute as code. Компилятор не создает исполняемый код из комментариев. The compiler doesn’t generate any executable code from comments.

Использование циклов для повторения операций Use loops to repeat operations

В этом разделе циклы используются для повторения операторов. In this section, you use loops to repeat statements. Добавьте следующий код после вызова ExploreIf : Add this code after the call to ExploreIf :

Оператор while проверяет условие и выполняет инструкцию или блок инструкций, следующий после while . The while statement checks a condition and executes the statement or statement block following the while . Проверка условия и выполнение этих операторов будут повторяться, пока условие не примет значение false. It repeatedly checks the condition and executing those statements until the condition is false.

В этом примере представлен еще один новый оператор. There’s one other new operator in this example. Объект ++ после переменной counter представляет собой оператор инкремента. The ++ after the counter variable is the increment operator. Он добавляет 1 к значению counter и сохраняет это значение в переменной counter . It adds 1 to the value of counter and stores that value in the counter variable.

Напишите такой код, при выполнении которого значение условия цикла while изменится на false. Make sure that the while loop condition changes to false as you execute the code. В противном случае будет создан бесконечный цикл, в котором выполнение программы никогда не закончится. Otherwise, you create an infinite loop where your program never ends. Это не показано в примере, так как нужно принудительно закрыть программу, нажав клавиши CTRL+C, или другим способом. That is not demonstrated in this sample, because you have to force your program to quit using CTRL-C or other means.

В цикле while условие проверяется, прежде чем выполнить код, который следует после while . The while loop tests the condition before executing the code following the while . А в цикле do . while сначала выполняется код, а потом проверяется условие. The do . while loop executes the code first, and then checks the condition. Цикл do while показан в следующем примере кода. The do while loop is shown in the following code:

Читайте также:  Palm treo with windows mobile

Этот цикл do и цикл while , приведенный выше, выводят одинаковый результат. This do loop and the earlier while loop produce the same output.

Работа с циклом for Work with the for loop

Цикл for широко используется в C#. The for loop is commonly used in C#. Выполните этот код: Try this code:

Этот цикл работает так же, как циклы while и do , которые вы использовали ранее. The previous code does the same work as the while loop and the do loop you’ve already used. Оператор for состоит из трех частей, которые отвечают за его работу. The for statement has three parts that control how it works.

Первая часть — для инициализатора: int index = 0; объявляет index переменной цикла и задает для ее начальное значение 0 . The first part is the for initializer: int index = 0; declares that index is the loop variable, and sets its initial value to 0 .

Средняя часть — для условия: index объявляет, что этот цикл for продолжает выполняться, пока значение счетчика меньше 10. The middle part is the for condition: index declares that this for loop continues to execute as long as the value of counter is less than 10.

Последняя часть — для итератора: index++ определяет, как изменится переменная цикла после выполнения блока, следующего после оператора for . The final part is the for iterator: index++ specifies how to modify the loop variable after executing the block following the for statement. В нашем случае определяется, что значение index должно увеличиваться на 1 каждый раз, когда выполняется блок. Here, it specifies that index should be incremented by 1 each time the block executes.

Поэкспериментируйте. Experiment yourself. Попробуйте использовать следующие варианты. Try each of the following variations:

  • Измените инициализатор, чтобы цикл начинался с другого значения. Change the initializer to start at a different value.
  • Измените условие, чтобы цикл заканчивался другим значением. Change the condition to stop at a different value.

По окончании попробуйте самостоятельно написать код, чтобы применить полученные знания. When you’re done, let’s move on to write some code yourself to use what you’ve learned.

Есть еще одна циклическая инструкция, которая не рассматривается в этом руководстве: оператор foreach . There’s one other looping statement that isn’t covered in this tutorial: the foreach statement. Оператор foreach повторяет выполнения для каждого элемента в последовательности элементов. The foreach statement repeats its statement for every item in a sequence of items. Чаще всего он используется с коллекциями, поэтому он рассматривается в следующем руководстве. It’s most often used with collections, so it’s covered in the next tutorial.

Создание вложенных циклов Created nested loops

Цикл while , do или for можно вложить в другой цикл, чтобы создать матрицу, комбинируя каждый элемент во внешнем цикле с каждым элементом во внутреннем цикле. A while , do , or for loop can be nested inside another loop to create a matrix using the combination of each item in the outer loop with each item in the inner loop. Давайте сделаем это для получения набора из буквенно-цифровых пар, представляющих строки и столбцы. Let’s do that to build a set of alphanumeric pairs to represent rows and columns.

Один цикл for может создавать строки: One for loop can generate the rows:

Другой цикл может создавать столбцы: Another loop can generate the columns:

Можно вложить один цикл внутрь другого для формирования пар: You can nest one loop inside the other to form pairs:

Как видите, внешний цикл увеличивается на единицу при каждом полном выполнении внутреннего цикла. You can see that the outer loop increments once for each full run of the inner loop. Измените порядок вложенности строк и столбцов и просмотрите изменения самостоятельно. Reverse the row and column nesting, and see the changes for yourself. По завершении поместите код, приведенный в этом разделе, в метод ExploreLoops() . When you’re done, place the code from this section in a method called ExploreLoops() .

Объединение ветвей и циклов Combine branches and loops

Теперь, когда вы ознакомились с оператором if и конструкциями цикла на языке C#, попытайтесь написать код C# для поиска суммы всех целых чисел от 1 до 20, которые делятся на 3. Now that you’ve seen the if statement and the looping constructs in the C# language, see if you can write C# code to find the sum of all integers 1 through 20 that are divisible by 3. Вот несколько подсказок: Here are a few hints:

  • оператор % позволяет получить остаток от операции деления; The % operator gives you the remainder of a division operation.
  • оператор if предоставляет условие, которое позволяет определить, будет ли число учитываться в сумме; The if statement gives you the condition to see if a number should be part of the sum.
  • цикл for позволяет повторить последовательность шагов для всех чисел от 1 до 20. The for loop can help you repeat a series of steps for all the numbers 1 through 20.

Попробуйте самостоятельно. Try it yourself. Затем проверьте результат. Then check how you did. Вы должны получить ответ «63». You should get 63 for an answer. Один из возможных ответов можно увидеть в полном примере кода в GitHub. You can see one possible answer by viewing the completed code on GitHub.

Вы ознакомились с руководством по ветвям и циклам. You’ve completed the «branches and loops» tutorial.

Теперь вы можете перейти к ознакомлению с руководством Массивы и коллекции в своей среде разработки. You can continue with the Arrays and collections tutorial in your own development environment.

Дополнительные сведения об этих понятиях см. в следующих статьях: You can learn more about these concepts in these articles:

Оцените статью