2010-02-18 1 views
1

У меня есть пользовательская структура ведения журнала, которая записывается в System.Windows.Forms.TextBox. Путь я пишу в TextBox теперь так:Есть ли другой способ добавить текст в элемент управления Textbox?

tbLog.Text += newLogEntry.Text; 

Проблема такого подхода заключается в том, что каждый раз, когда это выполняется строки из tbLog.Text и newLogEntry.Text сцепляются, а затем присваивается tbLog.Text. По мере того, как журнал в TextBox растет, операция становится очень интенсивной и все более медленной.

Есть ли способ сделать это быстрее и эффективнее?

+0

Почему вы входите в текстовое поле? Когда приложение будет закрыто, вы потеряете журнал. Должна ли она хранить всю историю или только последние записи x? – Oded

ответ

3

TextBox имеет функцию AppendText(). Вы должны использовать это вместо этого, потому что он формируется намного лучше, чем оператор +=.

1

«Проблема» заключается в том, что добавление строки в другую строку приводит к появлению каждой новой строки. Это может быть довольно дорого, когда вы делаете много конкатений.

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

Вы можете, например, хранить сообщения в StringCollection или List<String>. Вместо того, чтобы визуализировать его в текстовом поле, вы можете использовать ListBox, например, и каждый раз, когда вы добавляете новый элемент в журнал, вы можете добавить новый элемент в ListBox. Но я бы удостоверился, что это не тесно связано. Ваш класс журнала может запускать событие, например, каждый раз, когда новое сообщение сохраняется в журнале. Тогда у вас могут быть разные «наблюдатели», которые отслеживают журнал, подписываясь на события и предпринимая соответствующие действия каждый раз, когда возникает событие.

1

Лично я сделал бы всю работу внутри StringBuilder, используя .Append(). Затем я установил текстовое свойство textbox с помощью метода .ToString() в StringBuilder.

+0

Разве это не сейчас? – m0sa

+0

Нет, вы не используете строковый конструктор. –

+0

Хорошо. Я неправильно понял ваш ответ. Думаю, вы имели в виду, что я должен сделать что-то вроде этого: var sb = new StringBuilder (tbLog.Text); sb.AppendLine (newLogEntry.Text); tbLog.Text = sb.ToString() Но теперь я использую строковый построитель как переменную класса в классе logger и просто добавляю к нему каждый раз, когда новые файлы ввода записываются .. – m0sa