Программное скрытие нескольких столбцов в DataGridView происходит очень медленно

У меня есть DatagridView примерно с 300 столбцами и 80 строками. Каждый столбец может быть 3-х разных типов.

Есть 3 флажка, которые отвечают за отображение / скрытие столбцов, каждый флажок для каждого типа столбца.

    private void HideColumns(DataGridView datagridview)
    {
        if (datagridview.DataSource == null) return;

        var watch = Stopwatch.StartNew();

        // Added this code further the comment
        Control c = datagridview;
        while (c != this)
        {
            c.SuspendLayout();
            c = c.Parent;
        }
        this.SuspendLayout();       

        CurrencyManager currencyManager = null;
        try
        {
            RemoveHandler(datagridview); // remove all the handlers to the datagridivew for performance issue
            currencyManager = (CurrencyManager)BindingContext[datagridview.DataSource];
            currencyManager.SuspendBinding();
            //datagridview.Visible = false;

            for (int i = 0; i < datagridview.Columns.Count; i++)
            {
                var column = datagridview.Columns[i];

                var itemType = datagridview.Rows[(int)OrdersAndComponentsRows.ItemType].Cells[column.Index].Value.ToString();
                if (itemType == Glossary.IndirectCOType )
                    column.Visible = IndirectCOCheckBox.Checked;
                else if (itemType == Glossary.NotAllocatedType )
                    column.Visible = NotAllocatedCheckBox.Checked;
                else 
                    column.Visible = DirectCOCheckBox.Checked;
            }
        }
        finally
        {
            //datagridview.Visible = true;
            if (currencyManager != null)
                currencyManager.ResumeBinding();
            AddHandler(datagridview);

            // Added this code further the comment
            c = datagridview;
            while (c != this)
            {
                c.ResumeLayout();
                c = c.Parent;
            }
            this.ResumeLayout();
        }

    // 3 check boxes are subscribed to this event
    private void DisplayColumn_CheckedChanged(object sender, EventArgs e)
    {
        try
        {
            Cursor = Cursors.WaitCursor;
            HideColumns(ShipCoverageDGV);
        }
        finally
        {
            Cursor = Cursors.Default;
        }
    }

Проблема в том, что когда я снимаю один из флажков, скрытие столбцов занимает около 50 секунд. Странно то, что при установке флажка скрытые столбцы отображаются примерно за 5 секунд.

Можно ли выполнить какую-либо операцию, чтобы быстрее скрыть столбцы?

SuspendLayout()? И, конечно же, ResumeLayout. Возможно создание DGV с двойной буферизацией ..
TaW 25.04.2018 18:30

@TaW, я обновил свой пост с вашим предложением, но с той же проблемой. Отображение столбца по-прежнему занимает около 50 секунд.

ehh 26.04.2018 07:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
464
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий

Установка AutoSizeRowMode на DisplayedHeaders решила проблему. Это занимает около 1 секунды. Перед установкой значения этому свойству было присвоено значение AllCells.

datagridview.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedHeaders;

Примечание. Установка для свойства None уменьшает время примерно до 12 секунд.

Весь метод, включая исправление:

    private void HideColumns(DataGridView datagridview)
    {
        try
        {
            datagridview.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedHeaders;

            for (int i = 0; i < datagridview.Columns.Count; i++)
            {
                var column = datagridview.Columns[i];

                var itemType = datagridview.Rows[(int)OrdersAndComponentsRows.ItemType].Cells[column.Index].Value.ToString();
                if (itemType == Glossary.IndirectCOType)
                    column.Visible = IndirectCOCheckBox.Checked;
                else if (itemType == Glossary.NotAllocatedType)
                    column.Visible = NotAllocatedCheckBox.Checked;
                else
                    column.Visible = DirectCOCheckBox.Checked;
            }
        }
        finally
        {
            datagridview.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
        }
    }

Ах, это тоже имеет смысл.

TaW 26.04.2018 12:51

Другие вопросы по теме