Скрытие нескольких столбцов программным способом в DataGridView происходит очень медленно - PullRequest
0 голосов
/ 25 апреля 2018

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

Существует 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 секунд.

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

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Установка 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;
        }
    }
0 голосов
/ 26 апреля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...