OldPCGuy Ответов: 2

Как написать в текстовое поле


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

эта работа...
private void button1_Click(object sender, EventArgs e)
 {
     textBox1.Text = "My test";
     txbSysColors.Text = "";
 }

 private void button2_Click(object sender, EventArgs e)
 {
     txbSysColors.Text = "System Colors";
     textBox1.Text = "";
 }


Что я уже пробовал:

Когда я добавляю условные операторы, я больше не могу писать текстовые поля, даже передавая литеральную строку между кавычками. Я вижу содержимое "str", и содержащиеся в нем данные верны.

все текстовые поля остаются пустыми при выполнении этого кода.
private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            StreamReader stream = new StreamReader(openFileDialog1.FileName);

            string str = "";

            while ((str = stream.ReadLine()) != null)
            {
                if (str.Contains("SYS_CLR"))
                {
                    txbSysColors.Text = str.Split('=').Last().ToString();
                    txbSysColors.Text = "here";
                    textBox1.Text = "here";
                    textBox1.Text = str;
                }
            }
        }


Есть ли какая-то проблема масштаба, которую я не понимаю?

Dylvh

Одна вещь, которую вы делаете, это то, что вы переписываете свои результаты. У вас есть txbSysColors.Text = str.Split('=').Last().ToString(); а затем под этой строкой у вас есть txbSysColors.Text = "здесь"; который перезаписывает то, что вы установили для него в строке над ним. Вы делаете то же самое с textBox1. Почему бы не использовать stringbuilder?

OldPCGuy

Я знаю.

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

Dylvh

Ой.. Я должен был догадаться, что это для устранения неполадок.

2 Ответов

Рейтинг:
12

Dave Kreskowiak

Да. Текстовые поля будут оставаться пустыми до тех пор, пока не вернется код обработчика событий button1 click.

Чего вам не хватает, так это того, что ваш код приложения работает на так называемом потоке пользовательского интерфейса. Существует насос сообщений, который Windows использует, чтобы сообщить вашему приложению о том, что происходит, например, нажатие клавиш, перемещение мыши и щелчки кнопок. Он также обрабатывает сообщения, которые говорят вашему приложению рисовать такие вещи, как формы, кнопки, текстовые поля и все остальное.

Проблема в том, что ваш код работает в том же потоке, что и насос сообщений. Таким образом, пока ваш код выполняет что-то вроде обработчика событий, поток пользовательского интерфейса не может обработать насос сообщений, что означает, что ваши элементы управления и формы не перекрашиваются новыми данными. Ваше текстовое поле не будет перерисовываться до тех пор, пока метод button1_Click не завершится и не вернется. Ваше приложение вернется в состояние ожидания, и насос сообщений может быть обработан.

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

Теперь у вас новая проблема. Вы не можете касаться каких-либо методов или свойств элементов управления из чего-либо другого, кроме потока пользовательского интерфейса. Итак, теперь вам нужен другой метод, который просто обновляет текстовое поле с данными, которые вам нужны для его использования, а затем вызывает этот метод из вашего метода обработки. Это приведет к выполнению метода обновления текстового поля в потоке пользовательского интерфейса.


GenJerDan

И, если я не думаю ясно, этот код будет в конечном итоге отображать только последний экземпляр, который соответствует условию. Что ж...они все могут появиться, но вы их не увидите, потому что они пролетят очень быстро. ;)

Pawel Wzietek

"пока ваш код выполняет что-то вроде обработчика событий, поток пользовательского интерфейса не может обработать сообщение pump "

По-прежнему можно вызвать насос сообщений изнутри обработчика с помощью функции "DoEvents()". Конечно, в этом случае сам обработчик должен быть реентерабельным.

Dave Kreskowiak

Это плохая привычка, которой я предпочел бы никого не учить.

Если вы используете DoEvents, вы настраиваете себя на неудачу.

Рейтинг:
0

OldPCGuy

Я закомментировал цикл "while", и функция split работала так , как ожидалось, текстовые поля обновлялись точно так же, как вы сказали, как только обработчик условий выходил.

Это никогда не бывает легко, не так ли :(