Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > StackOverflowException при VirtualMode


Автор: Grandpa 28.7.2008, 16:51
Никто не сталкивался с такой проблемой.
В таблице хранятся "приход" и "расходы", т.е. существует поле, которое содержит ключ записи в той же таблице. Отношение один-ко-многим в одной таблице. 
Соответственно два DataGridView, первый отображает "приходы", а второй "расходы" (для каждого "прихода" из 1-го грида).

Всё работает нормально до тех пор, пока во втором гриде не устанавливаешь VirtualMode=true и не делаешь поле для этого режима (для подсчета разности двух полей таблицы). При загрузке формы вываливается StackOverflowException. Поэкспериментировал, StackOverflowException вываливается даже тогда, когда в поле просто заносишь число!

Похоже, где-то образуется рекурсия, но где?

Автор: Partizan 28.7.2008, 17:32
Grandpa, 
часто бывает, когда по невнимательности получается такое свойство:

Код

private double myField;

public double MyField
{
   get {return MyField;} //MyField вместо myField
   set {MyField = value;}//тоже.
}

Автор: Grandpa 28.7.2008, 17:43
Спасибо, запомню на будующее. Но в данном случае не то.

Код

        private void tbMovementDataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            DataGridView grid = sender as DataGridView;
            DataGridViewRow rw = grid.Rows[e.RowIndex];
            if (grid.Columns[e.ColumnIndex].Name == "Column1")
            {
                rw.Cells["Column1"].Value = 1;  // Если закоментировать эту строку, то всё работает нормально.
            }
        }

Автор: Partizan 28.7.2008, 17:46
Grandpa, а под отладчиком никак не посмотреть на чём именно зацикливается программа?

Автор: Grandpa 28.7.2008, 19:56
Просматривал. В сгенерированном коде, когда Resume для первого грида. Точнее показать не могу, т.к. сейчас я дома. Завтра с работы дам отрывок кода. Есть предположение, что надо поменять порядок генерации (через taborder), сначала 1-й граид, потом 2-й (сейчас наоборот).

Автор: Grandpa 29.7.2008, 10:00
Ещё раз пошёлся отладчиком. Картина такая. При создании окна успешно проходит инициализация компонентов. Затем несколько обращенией к CellValueNeeded для создания виртуальных колонок для 1-го грида, затем много обращений к CellValueNeeded для 2-го грида и, похоже, в 
этом месте безконечный цикл.  Обращения происходят из кода недоступного отладчику.

Автор: Grandpa 29.7.2008, 10:55
Ура! Разобрался сам. Моя вина. Для других гридов делал правильно, а в этом бес попутал! smile 
Код

        private void tbMovementDataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            DataGridView grid = sender as DataGridView;
            DataGridViewRow rw = grid.Rows[e.RowIndex];
            if (grid.Columns[e.ColumnIndex].Name == "Column1")
            {
//             rw.Cells["Column1"].Value = "12345";  // Ошибка!!!!!!!!!!!!!!!
                e.Value = "12345";
            }
        }

Нельзя напрямую устанавливать значение ячейки, только через параметр e! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)