#c# #winforms #loops #textbox #label
Вопрос:
Я пишу приложение для флэш-карт в форме Windows.
Прямо сейчас я пытаюсь прочитать слово из массива строк и передать его в метку. Затем попросите пользователя написать перевод этого слова. И, наконец, передайте результат в поле метки.
Вот мой код:
public partial class EnglishPolishScreen : Form
{
//English words array
string[] words = new string[] { "word1", "word2", "word3", "word4" };
// meanings words array
string[] wordB = new string[] { "slowo1", "slowo2", "slowo3", "slowo4" };
int element = 0;
Thread thread;
public EnglishPolishScreen()
{
InitializeComponent();
}
private void CloseAppEvent(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
private void button1_Click(object sender, EventArgs e)
{
thread = new Thread(Threadd);
thread.Start();
}
private void Threadd()
{
englishWord.Text = words[element];
counterLabel.Text = element 1 " of " words.Length;
if (answerBox.Text.Equals(wordB[element]))
{
resultLabel.Text = "Good";
element ;
}
else
resultLabel.Text = "Bad";
if (element == words.Length)
{
element = 0;
}
}
private void EnglishPolishScreen_Load(object sender, EventArgs e)
{
englishWord.Text = words[element];
}
Отредактированный
Ребята, почему я должен нажать два раза на кнопку, чтобы увидеть следующий элемент из массива? И почему я вижу «плохой» ответ сразу после нажатия кнопки? «Хороший» ответ появляется после второго щелчка.
Отредактировано v2.xD Отсортировано. В любом случае, это хороший способ написать такой код? Если нет, то как Это может выглядеть лучше? Спасибо
С уважением
Комментарии:
1. когда вы сталкиваетесь с хорошим ответом, вы не останавливаете цикл . поэтому, получив правильную запись, вы проверяете следующую. что неверно.
2. Попытка запустить функции пользовательского интерфейса в фоновом потоке, как правило, является плохой практикой. Пользовательский интерфейс должен обрабатываться одним потоком, и если вам нужны фоновые потоки, то должна быть реализована какая-то передача сообщений. В вашем случае я не вижу никакой причины, по которой требуется фоновый поток.
3. Первое, что вам нужно сделать, это удалить BackgroundWorker и
CheckForIllegalCrossThreadCalls = false
то, что вы где-то установили. — Не пытайтесь использовать приложение WinForms, как это было консольное приложение. Интерфейс управляется событиями, циклы, используемые в консольном приложении для получения пользовательского ввода, здесь не работают.4. Спасибо тебе большое 😉
5. Как выглядит этот код, ребята? Как я могу его улучшить?
Ответ №1:
При нажатии кнопки он проходит весь цикл for, т. Е. весь список значений, вам придется прервать цикл for, как только будет найдено правильное совпадение. Так что просто используйте break;
после resoultLabel.Text = "Good answer!";
. Также, как указал @Neil, не рекомендуется использовать пользовательский интерфейс в отдельном фоновом потоке.
Кстати, я не в состоянии разобраться в логике chances
происходящего . Для предоставления шансов вам придется объявить глобальную переменную, которая будет добавляться/вычитаться, когда будет найден неверный ответ после итерации по всему циклу for, запрещая любые дальнейшие испытания для этого слова.
Комментарии:
1. Спасибо тебе большое 😉