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

問題は、チェックボックスの1つをオフにすると、列を非表示にするのに約50秒かかることです。 奇妙なことに、チェックボックスをチェックしたときに、隠された列を表示するのに約5秒かかります。

列を早く非表示にするために実行できる操作はありますか?

0
@TaW、私の投稿をあなたの提案で更新しましたが、同じ問題です。列を表示するのにまだ約50秒かかります。
追加された 著者 ehh,
@TaW、私の投稿をあなたの提案で更新しましたが、同じ問題です。列を表示するのにまだ約50秒かかります。
追加された 著者 ehh,
SuspendLayout()そしてResumeLayout、もちろん。おそらくDGVをDoubleBufferedにする..
追加された 著者 TaW,

4 答え

Setting AutoSizeRowMode to DisplayedHeaders solved the problem. It takes about 1 second. Before setting the value, this property was set to 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
追加された
ああ、それも理にかなっている。
追加された 著者 TaW,

Setting AutoSizeRowMode to DisplayedHeaders solved the problem. It takes about 1 second. Before setting the value, this property was set to 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
追加された
ああ、それも理にかなっている。
追加された 著者 TaW,

コードのどの部分に時間がかかっているのかを把握する必要があると思います。hide columnsメソッドにはたくさんのことが起こります。レイアウトを中断し、列を反復処理して列を非表示にするのに費やした時間のように、より細かいレベルで時間を書き留めてください。 300個の列があり、それぞれの型をチェックし、それらの型に基づいて非表示になっているため、問題ステートメントは反復に費やされる時間になります。

0
追加された

コードのどの部分に時間がかかっているのかを把握する必要があると思います。hide columnsメソッドにはたくさんのことが起こります。レイアウトを中断し、列を反復処理して列を非表示にするのに費やした時間のように、より細かいレベルで時間を書き留めてください。 300個の列があり、それぞれの型をチェックし、それらの型に基づいて非表示になっているため、問題ステートメントは反復に費やされる時間になります。

0
追加された