Как я могу предотвратить Добавление RichTextBox, которое может вызвать OutOfMemory? - PullRequest
5 голосов
/ 29 мая 2011

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

Может ли кто-нибудь показать мне, как я могу предотвратить это, я имею в виду, может быть, ограничить 300 строк с помощью FIFO, или 500 строк, затем очистить и снова обновить ... Однако я не уверен, Как я могу это реализовать.

    void WriteLog(string txt)
    {

        richTextBox1.AppendText(txt + Environment.NewLine);
        richTextBox1.HideSelection = false;
        richTextBox1.SelectionStart = richTextBox1.Text.Length;
    }

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

Если вы хотите удалить строки, чем пытаться использовать это

    void WriteLog(string txt)
    {
        if(richTextBox1.Lines.Count() == 100)
        {
            DeleteLine(0);
        }
        richTextBox1.AppendText(txt + Environment.NewLine);
        richTextBox1.HideSelection = false;
        richTextBox1.SelectionStart = richTextBox1.Text.Length;
    }

    private void DeleteLine(int a_line)
    {
        int start_index = richTextBox1.GetFirstCharIndexFromLine(a_line);
        int count = richTextBox1.Lines[a_line].Length;

        // Eat new line chars
        if (a_line < richTextBox1.Lines.Length - 1)
        {
            count += richTextBox1.GetFirstCharIndexFromLine(a_line + 1) -
                ((start_index + count - 1) + 1);
        }

        richTextBox1.Text = richTextBox1.Text.Remove(start_index, count);
    }
0 голосов
/ 29 мая 2011

попробуйте этот код, чтобы удалить последнюю строку и затем добавить текст, тогда у вас будет ограничение в 300 строк:

    private void RemoveLastLineAfter300()
    {
        if(richTextBox1.TextLength != 0)
        {
            int totalCharacters = richTextBox1.Text.Trim().Length;
            int totalLines = richTextBox1.Lines.Length;
            string lastLine = richTextBox1.Lines[totalLines - 1] + "\n";
            string copyOfLastLine = richTextBox1.Lines[totalLines - 1];
            if(totalLines > 300)
            {
                string newstring = richTextBox1.Text.Substring(0, totalCharacters - lastLine.Length);
                richTextBox1.Text = newstring;
            }
        }
    }

А если вы хотите очистить текст (если я правильно понял) после 500 строк, просто отметьтеСобытие TextChanged

if(richTextBox1.Lines.Length > 500)
   richTextBox1.Text = string.Empty;

Надеюсь, это вам поможет.

...