StackOverFlowException в пользовательском элементе

Рейтинг: 1Ответов: 1Опубликовано: 20.04.2023

Очень часто мне необходимо в элементе DataGridView отображать по умолчанию вертикальный скролбар. Для этих целей я использую простенький расширитель для стандартного контрола.

internal partial class CustomDataGridView : DataGridView
{
    internal CustomDataGridView() : base()
    {
        this.VerticalScrollBar.Visible = true;
        this.VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged);
    }

    internal void VerticalScrollBar_VisibleChanged(object sender, EventArgs e)
    {
        if (!this.VerticalScrollBar.Visible)
        {
            this.VerticalScrollBar.Location = new Point(this.ClientRectangle.Width - this.VerticalScrollBar.Width - 1, 1);
            this.VerticalScrollBar.Height = this.ClientRectangle.Height - 2;
            this.VerticalScrollBar.Width = this.VerticalScrollBar.Width;
            this.VerticalScrollBar.Show();
        }
    }
}

Недавно заметил что при повторном заполнении CustomDataGridView вываливается непонятно откуда появляющееся сообщение. Частота появления непредсказуема. Может 20 раз обновиться без проблем, а может при первом же обновлении выдать это:

введите сюда описание изображения

Сам код работы с контролом такой:

    public void writeNameTable(NameTable NameTable)
    {
        if (InvokeRequired)
        {
            BeginInvoke(new writeNameTableDelegate(writeNameTable), new object[] { NameTable });
            return;
        }

        this.dataGridView1.Rows.Clear();

        NAME_TABLE = NameTable.NAMES;
        for (int i = 0; i < NAME_TABLE.Length; i++)
        {
            this.dataGridView1.Rows.Add(1);

            int index = this.dataGridView1.Rows.GetLastRow(DataGridViewElementStates.Visible);

            this.dataGridView1.Rows[index].Cells[0].Value = i.ToString();
            this.dataGridView1.Rows[index].Cells[1].Value = NAME_TABLE[i].Name;
            this.dataGridView1.Rows[index].Cells[2].Value = ((ObjectFlags)NAME_TABLE[i].ObjectFlag).ToString();
        }
    }

Вопрос: как отловить/исправить подобное исключение?

Ответы

▲ 2Принят

StackOverflowException невозможно отловить. Это исключение возникает, когда текущий поток далее не может работать из-за переполнения стека. То есть данное исключение в любом случае приводит к падению приложения.

Всё что можно сделать - это исправить код, чтобы данный тип исключений не возникал. Для анализа причин исключения изучите трассировку стека, там должна быть цепочка рекурсивных вызовов, которая поможет понять изначальную причину.

Вероятно причиной появления исключения является другой обработчик этого же события VisibleChanged который выполняет действие, обратное текущему, для этого либо родительского контрола. Я бы не рекомендовал меняеть Visible в этом обработчике, не вижу причин для вызова Show().

У вас примерно такая рекурсия

void Method1()
{
    Method2();
}

void Method2();
{
    Method1();
}

Если в этом примере вызвать любой из методов, будет StackOverflowException.