Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Подвисание приложения на C#


Автор: sadisasha 1.4.2009, 14:42
Такая ситуация на форме расположен ListView, ширина ColumnHeader сохраняеться в файл настроек. При изменении размера ColumnHeader
обрабатывается событие изменения ColumnHeader
Код

private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
        {
            this.OpenSettings(); // возвращаются первоначальные настройки, тоесть ширина Columnheader
        }

Приложение не дает пользователю поменять ширину столбцов, и вот в это время происходит подвисание, столбцы встают на свои места, а изменённый курсор не которое время остается. И в это время я не могу работать с ListView.
В чём может быть причина?

Автор: Idsa 1.4.2009, 14:47
sadisasha, а не входит ли приложение в рекурсию? Вы обрабатываете ColumnWidthChanged, изменяя внутри него ширину столбца, в результате чего опять будет вызван ColumnWidthChanged и т. д.

Автор: sadisasha 1.4.2009, 15:19
Цитата(Idsa @ 1.4.2009,  14:47)
sadisasha, а не входит ли приложение в рекурсию? Вы обрабатываете ColumnWidthChanged, изменяя внутри него ширину столбца, в результате чего опять будет вызван ColumnWidthChanged и т. д.

Сделал вот так
Код

        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
        {
            int index = e.ColumnIndex;
            switch (index)
            {
                case 0:
                    columnHeader1.Width = mainSettings.Column1Width;
                    break;
                case 1:
                    columnHeader2.Width = mainSettings.Column2Width;
                    break;
                case 2:
                    columnHeader3.Width = mainSettings.Column3Width;
                    break;
            }
        }

Помогло!
Но всё равно, я как новичек ничего непонял.

Автор: sadisasha 5.4.2009, 23:33
Цитата(sadisasha @ 1.4.2009,  15:19)
Цитата(Idsa @ 1.4.2009,  14:47)
sadisasha, а не входит ли приложение в рекурсию? Вы обрабатываете ColumnWidthChanged, изменяя внутри него ширину столбца, в результате чего опять будет вызван ColumnWidthChanged и т. д.

Сделал вот так
Код

        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
        {
            int index = e.ColumnIndex;
            switch (index)
            {
                case 0:
                    columnHeader1.Width = mainSettings.Column1Width;
                    break;
                case 1:
                    columnHeader2.Width = mainSettings.Column2Width;
                    break;
                case 2:
                    columnHeader3.Width = mainSettings.Column3Width;
                    break;
            }
        }

Помогло!
Но всё равно, я как новичек ничего непонял.

Этот код отказывается работать в XP, отладчик пишет что то типа незаконченный цикл или рекурсия. Сейчас я понял почему это происходит, но как обойти. Может есть какой другое решение? т.к метод listView_ColumnWidthChanged использовать нельзя.

Автор: Idsa 6.4.2009, 05:40
sadisasha, с WinForms давно не имел дел... но по-моему рекурсию можно обойти, обработав ColumnWidthChanging. Если мне не изменяет память, при изменении e.NewWidth повторного вызова не происходит.
Код

        private void listView_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
        {
            int index = e.ColumnIndex;
            switch (index)
            {
                case 0:
                    e.NewWidth = mainSettings.Column1Width;
                    break;
                case 1:
                    e.NewWidth = mainSettings.Column2Width;
                    break;
                case 2:
                    e.NewWidth = mainSettings.Column3Width;
                    break;
            }
        }

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