在DataGridView中以编程方式隐藏多个列非常慢

时间:2018-04-25 14:38:38

标签: c# winforms user-interface datagridview

我有一个大约300列和80行的DatagridView。 每列可以有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秒钟。

为了更快地隐藏列,是否可以执行任何操作?

2 个答案:

答案 0 :(得分:1)

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;
        }
    }

答案 1 :(得分:0)

我认为您需要弄清楚代码的哪一部分需要时间。您的隐藏列方法中会发生很多事情。您是否可以在更精细的级别记下时间,例如花费多少时间来暂停布局与迭代列并使列隐藏。一旦您知道有问题的区域,您就可以优化那个。我假设在这里问题陈述将是花在迭代上的时间,因为我们有300列并检查每个列的类型并根据它们的类型隐藏。