मेरे पास लगभग 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 सेकंड का समय लगता है।

क्या कोई ऐसा ऑपरेशन है जो कॉलम को तेजी से छिपाने के लिए किया जा सकता है?

0
ehh 25 अप्रैल 2018, 17:38

2 जवाब

सबसे बढ़िया उत्तर

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
ehh 26 अप्रैल 2018, 10:22

मुझे लगता है कि आपको यह पता लगाने की जरूरत है कि कोड का कौन सा हिस्सा समय ले रहा है। आपके छिपाने कॉलम विधि में बहुत सी चीजें हो रही हैं। क्या आप अधिक बारीक स्तर पर समय को नोट कर सकते हैं, जैसे कि लेआउट को निलंबित करने बनाम स्तंभों पर पुनरावृति करने और स्तंभों को छिपाने में कितना समय व्यतीत किया गया था। एक बार जब आप समस्याग्रस्त क्षेत्र को जान लेते हैं तो आप उस एक को अनुकूलित करने पर काम कर सकते हैं। मैं यहाँ मान रहा हूँ समस्या कथन वह समय होने जा रहा है जो पुनरावृत्ति पर खर्च किया गया है क्योंकि हमारे पास 300 कॉलम हैं और प्रत्येक के प्रकार की जांच कर रहे हैं और उनके प्रकार के आधार पर छुपा रहे हैं।

0
ErGaurav 26 अप्रैल 2018, 09:45