Сравнение строки из метки и ввода(текстовое поле) и отображение результата в метке. Плюс работа с массивом

#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. Спасибо тебе большое 😉