Необработанное исключение типа «System.StackOverflowException» произошло в System.Windows.Forms.dll - PullRequest
0 голосов
/ 11 мая 2010

ОК, я пытаюсь выделить ключевые слова в richtextbox, проблема в том, что у меня есть код для выделения только видимого текста в событии textChanged, поэтому я попытался поместить код в richtextbox VScroll, поэтому, когда я прокручивал его будет выделять текст, который не был виден раньше, но каждый раз, когда я начинаю прокручивать, я получаю эту ошибку: «Произошло необработанное исключение типа« System.StackOverflowException »в System.Windows.Forms.dll» Кто-нибудь знает почему? Или, может быть, как я мог бы выделить слова при прокрутке? Спасибо, Таннер.

        int selectionstart = richTextBox1.Selectionstart;
        int topIndex = richTextBox1.GetCharIndexFromPosition(new Point(1, 1));//This is where I get the error.
        int bottomIndex = richTextBox1.GetCharIndexFromPosition(new Point(1, richTextBox1.Height - 1));

        int topLine = richTextBox1.GetLineFromCharIndex(topIndex);
        int bottomLine = richTextBox1.GetLineFromCharIndex(bottomIndex);

        int start = richTextBox1.GetFirstCharIndexFromLine(topLine);
        int end = richTextBox1.GetFirstCharIndexFromLine(bottomLine);

        int numLinesDisplayed = (bottomLine - topLine) + 2;
        richTextBox1.Focus();
        richTextBox1.Select(start, end);

Ответы [ 3 ]

2 голосов
/ 11 мая 2010

Вы, вероятно, запускаете событие VScroll этим кодом, чтобы ваш код вызывался снова, а затем снова вызывал событие, вызывался снова и так далее, и так далее, и в конце ваш стек заканчивается. *

Если говорить более конкретно, мне нужно увидеть ваш стек вызовов в момент исключения.

1 голос
/ 11 мая 2010

Почти наверняка цикл обработки событий. Вероятно, вызов richTextBox1.select () заставляет виджет пытаться прокрутить, что вызывает новое событие VScroll, ad infinitum (или пространство в стеке рекламы). Есть разные способы справиться с этим, но проще всего обычно установить флаг в первый раз через событие, а затем обернуть ваш код обработки в условное выражение, чтобы он выполнялся, только если флаг не установлен.

0 голосов
/ 11 мая 2010

Хорошо, что вам нужно, чтобы увидеть точно? Вот мой полный код:

 [DllImport("user32.dll")] // import lockwindow to remove flashing
    public static extern bool LockWindowUpdate(IntPtr hWndLock);

 public void Markup(RichTextBox RTB)
    {
        try
        {
            int selectionstart = richTextBox1.SelectionStart;
            Point pos = richTextBox1.Location;
            richTextBox1.Focus();
            int topIndex = richTextBox1.GetCharIndexFromPosition(new Point(1, 1));
            //int topIndex = richTextBox1.GetCharIndexFromPosition(point);
            int bottomIndex = richTextBox1.GetCharIndexFromPosition(new Point(1, richTextBox1.Height - 1));

            int topLine = richTextBox1.GetLineFromCharIndex(topIndex);
            int bottomLine = richTextBox1.GetLineFromCharIndex(bottomIndex);

            int start = richTextBox1.GetFirstCharIndexFromLine(topLine);
            int end = richTextBox1.GetFirstCharIndexFromLine(bottomLine);

            int numLinesDisplayed = (bottomLine - topLine) + 2;
            richTextBox1.Focus();
            richTextBox1.Select(start, end);



            Regex rex = new Regex("<html>|</html>|<head.*?>|</head>|<body.*?>|</body>|<div.*?>|</div>|<span.*?>|</span>|<title.*?>|</title>|<style.*?>|</style>|<script.*?>|</script>|<link.*?/>|<meta.*?/>|<base.*?/>|<center.*?>|</center>");
            foreach (Match m in rex.Matches(richTextBox1.SelectedText))
            {
                richTextBox1.Select(m.Index + start, m.Value.Length);
                richTextBox1.SelectionColor = Color.Blue;
                richTextBox1.Select(selectionstart, -1);
                richTextBox1.SelectionColor = Color.Black;
            }
            richTextBox1.DeselectAll();
            richTextBox1.SelectionStart = selectionstart;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex);
        }
    }


    private void richTextBox1_VScroll(object sender, EventArgs e)
    {


            try
            {


                LockWindowUpdate(richTextBox1.Handle);//Stop flashing
                Markup(richTextBox1);
                Elements(richTextBox1);
                FormsTabels(richTextBox1);
                Attributes(richTextBox1);
                Comments(richTextBox1);

            }
            finally { LockWindowUpdate(IntPtr.Zero); }


    }
...