Performance issue with custom cells.

28 posts, 2 answers
  1. Raymond
    Raymond avatar
    134 posts
    Member since:
    Jul 2010

    Posted 12 Nov 2010 Link to this post

    Hi!

                    I have to use custom cell to display data but I have problem with performance.

                    I have 500 rows and when I use my custom cell scrolling is very slow, not fluent.

    I made simple test and checked that even if I add only one child control to custom cell, scrolling performance goes down significantly.

    Is there any way to improve performance in this kind of scenario?

                    This is my source code:

     

     

    public class CustomCell : GridDataCellElement
    {
        private RadCheckBoxElement _chk;
        public CustomCell(GridViewColumn column, GridRowElement row) : base(column, row)
        {
        }
        protected override void CreateChildElements()
        {
            base.CreateChildElements();
            _chk = new RadCheckBoxElement();
            _chk.Margin = new Padding(2, 2, 2, 2);
            _chk.MinSize = new Size(20, 20);
            _chk.Text = string.Empty;
            _chk.ToggleState = ToggleState.Off;
            this.Children.Add(_chk);
        }
        protected override Type ThemeEffectiveType
        { get { return typeof(GridDataCellElement); } }
    }

    namespace PerformanceIssue
    {
        public partial class Form1 : Form
        {
            List<MySample> _list;
            public Form1()
            {
                InitializeComponent();
                _list = this.GenerateList();
            }
      
            private void btnPopulateUnbound_Click(object sender, EventArgs e)
            {
                GridViewDataColumn col = null;
                GridViewRowInfo row = null;
      
                for (int index = 1; index <= 10; index++)
                {
                    col = new CustomColumn();
                    radGridViewUnbound.Columns.Add(col);
                    col.Width = 100;
                }
      
                foreach (MySample item in _list)
                {
                    row = radGridViewUnbound.Rows.AddNew();
                    row.Cells[0].Value = item.Property1;
                    row.Cells[1].Value = item.Property2;
                    row.Cells[2].Value = item.Property3;
                    row.Cells[3].Value = item.Property4;
                    row.Cells[4].Value = item.Property5;
                    row.Cells[5].Value = item.Property6;
                    row.Cells[6].Value = item.Property7;
                    row.Cells[7].Value = item.Property8;
                    row.Cells[8].Value = item.Property9;
                    row.Cells[9].Value = item.Property10;
                }
                radGridViewUnbound.MultiSelect = true;
            }
      
            private List<MySample> GenerateList()
            {
                List<MySample> list = new List<MySample>();
                MySample item = null;
                for (int index = 0; index < 500; index++)
                {
                    item = new MySample()
                    {
                        Property1 = string.Format("Row: {0}, Col: {1}", index, 1),
                        Property2 = string.Format("Row: {0}, Col: {1}", index, 2),
                        Property3 = string.Format("Row: {0}, Col: {1}", index, 3),
                        Property4 = string.Format("Row: {0}, Col: {1}", index, 4),
                        Property5 = string.Format("Row: {0}, Col: {1}", index, 5),
                        Property6 = string.Format("Row: {0}, Col: {1}", index, 6),
                        Property7 = string.Format("Row: {0}, Col: {1}", index, 7),
                        Property8 = string.Format("Row: {0}, Col: {1}", index, 8),
                        Property9 = string.Format("Row: {0}, Col: {1}", index, 9),
                        Property10 = string.Format("Row: {0}, Col: {1}", index, 10)
                    };
                    list.Add(item);
                }
      
                return list;
            }
        }
    }

     

                   

    Regards

  2. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 12 Nov 2010 Link to this post

    Hello, 

    I have tried out your code and found no performance issues when scrolling. All rows scroll smoothly and without delay. For reference I am using the latest Q3 2010 version that came out yesterday. I'm unable to try your code on an older version. What version are you currently using? 

    Regards, 
    Richard
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Raymond
    Raymond avatar
    134 posts
    Member since:
    Jul 2010

    Posted 12 Nov 2010 Link to this post

    I have 2010 Q2 SP2.
    I am downloading Q3, I will check this issue on the newest version.
  5. Raymond
    Raymond avatar
    134 posts
    Member since:
    Jul 2010

    Posted 13 Nov 2010 Link to this post

    I have installed 2010 Q3 and now for unbound mode performance is even worst L

    I have WinXP SP3.

    Instead of CustomColumn I used standard
    GridViewTextBoxColumn and populating grid takes about 40s.

    For bound mode it takes about 2s!

     

    I have only 500 rows and 10 columns – something is wrong for unbound mode.

    Can you take a look once again on my source code? Maybe I do something wrong.

  6. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 13 Nov 2010 Link to this post

    Hi,

    You mention now about population speed, rather than scroll speed. Is this correct?

    Unbound mode will always be slower than bound mode to populate. The fastest way to populate a grid is via a datasource, next it is to use AddRange, then lastly, adding rows one by one.

    However, to dramatically speed up adding rows in unbound mode, you should use the new DeferRefresh method of the grid.

    See below, I have altered the code (from a button click) that generates your rows.

        private void radButton2_Click_1(object sender, EventArgs e)
        {
            GridViewTextBoxColumn col = null;
            GridViewRowInfo row = null;
            for (int index = 1; index <= 10; index++)
            {
                col = new GridViewTextBoxColumn();
                radGridView1.Columns.Add(col);
                col.Width = 100;
            }
            using (this.radGridView1.DeferRefresh())
            {
            foreach (MySample item in _list)
            {
                row = radGridView1.Rows.AddNew();
                row.Cells[0].Value = item.Property1;
                row.Cells[1].Value = item.Property2;
                row.Cells[2].Value = item.Property3;
                row.Cells[3].Value = item.Property4;
                row.Cells[4].Value = item.Property5;
                row.Cells[5].Value = item.Property6;
                row.Cells[6].Value = item.Property7;
                row.Cells[7].Value = item.Property8;
                row.Cells[8].Value = item.Property9;
                row.Cells[9].Value = item.Property10;
            }
            radGridView1.MultiSelect = true;
            radGridView1.Columns[0].IsPinned = true;            
           }
        }
    }


    Hope that helps
    Richard
  7. Answer
    Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 13 Nov 2010 Link to this post

    Hello again,

    Just try this:
    private void btnPopulateUnbound_Click(object sender, EventArgs e)
    {
        GridViewDataColumn col = null;
        GridViewRowInfo row = null;
     
        using (radGridView1.DeferRefresh())
        {
            for (int index = 1; index <= 10; index++)
            {
                col = new CustomColumn();
                radGridView1.Columns.Add(col);
                col.Width = 100;
            }
     
            foreach (MySample item in _list)
            {
                row = radGridView1.Rows.AddNew();
                row.Cells[0].Value = item.Property1;
                row.Cells[1].Value = item.Property2;
                row.Cells[2].Value = item.Property3;
                row.Cells[3].Value = item.Property4;
                row.Cells[4].Value = item.Property5;
                row.Cells[5].Value = item.Property6;
                row.Cells[6].Value = item.Property7;
                row.Cells[7].Value = item.Property8;
                row.Cells[8].Value = item.Property9;
                row.Cells[9].Value = item.Property10;
            }
            radGridView1.MultiSelect = true;
        }
    }
    Hope this helps, if you have any other questions or comments, please let me know,

    Best Regards,
    Emanuel Varga

    Telerik WinForms MVP
  8. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 13 Nov 2010 Link to this post

    Hi Emanuel,

    Isn't this the same thing (but with the DeferRefresh covering slightly more)?

    Regards,

    Richard
  9. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 13 Nov 2010 Link to this post

    Hello guys,

    The subject of this thread is performance. Using unbound mode will always be slower than bounded mode. But there are a few tricks to make it faster:
    - create all the rows (without adding them directly to the grid, store them in a list, or array) and add them using AddRange.
    - use BeginUpdate / EndUpdate or the newest one DeferRefresh in order to prevent an update on each action performed

    With unbound mode the best you could hope for is getting as close as possible to bound modes.

    Also, there is one thing to address here regarding the use of  the custom cell, one of them being overriding IsCompatible:
    public override bool IsCompatible(GridViewColumn data, object context)
                {
                    if (data.Name == "CustomColumn")
                    {
                        return true;
                    }
     
                    return base.IsCompatible(data, context);
                }

    To prevent display glitches when moving columns or other cases in which the grid has to decide what cell type is required.

    Hope this helps, if you have any other questions or comments, please let me know,

    Best Regards,
    Emanuel Varga

    Telerik WinForms MVP
  10. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 13 Nov 2010 Link to this post

    Hi Raymond,

    to sum up..
    I've provided you with information on RadgridView.DeferRefresh which enhances the performance of adding rows in unbound mode and also regarding adding rows via AddRange or use of a datasource. Emanuel has also provided information on IsCompatible.

    However, are you still experiencing scrolling performance issues as this was the subject of your first thread. If you can confirm this, and if so, under which scroll conditions you are experiencing issues, I'll be happy to help.

    All the best
    Richard

  11. Raymond
    Raymond avatar
    134 posts
    Member since:
    Jul 2010

    Posted 14 Nov 2010 Link to this post


    Yes I mention now about population speed, rather than scroll speed.

    So:

    1. Population speed – I used this new method DeferRefresh and now performance is ok for me – problem solved (even with custom cells). I also used method AddRange.

     

     

    2.   Scroll speed – this is still a problem, even if I use standard GridViewTextBoxColumn.

     

    Button with arrow down (in scroll control) is being continuously pressed and scrolling process is very slow, I see next row in each about 1 second – CPU is 0% all the time. Scrolling in System.Windows.Forms.DataGridView is much faster – CPU is also 0%.

    Because during scrolling (pressed button with arrow down in scroll control) CPU is 0% I think I could be faster. Is there any way to improve speed during scrolling (with standard GridViewTextBoxColumn)?

     

    The same problem is when I select last visible row and I keep pressed keyboard button arrow down (continuously) – but additionally in this case after couple seconds CPU jumps to 50%. In System.Windows.Forms.DataGridView it works fine.

     

    Do you have any ideas?



    btw: Where can I read about new members of classes in new relaeses of Telerik controls?


     Regards

     

     

  12. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 14 Nov 2010 Link to this post

    Hello Raymond,

    You can read about What's new in Q3 here
    The release notes for Q3 are here
    this link contains an overview of RadGridView for Q3

    I have noticed that the RadGridViews in the Demo applications seem to have the same issue with scrolling performance past the visible rows, and again as per your other thread, the workaround to this seems to be refreshing the RadGridView on selection changed.

    private void radGridView1_SelectionChanged(object sender, EventArgs e)
    {
        if (this.radGridView1.SelectedRows.Count > 0)
        {
            this.radGridView1.Refresh();
        }
     }

    I hope this heps, but just let me know if you need more information.

    All the best
    Richard
  13. Rafael
    Rafael avatar
    32 posts
    Member since:
    Jul 2010

    Posted 14 Nov 2010 Link to this post

    Hi guys,

    Just to let you know, i'm also facing this slow scrolling issue.
    It's like there's a 1s lag between the mouse wheel scroll and the grid scroll.. very annoying.

    (using Q2 and now Q3)

    Rafael
  14. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 14 Nov 2010 Link to this post

    Hello Rafael,

    Have you tried the workaround above? I.e
    private void radGridView1_SelectionChanged(object sender, EventArgs e)
    {
        if (this.radGridView1.SelectedRows.Count > 0)
        {
            this.radGridView1.Refresh();
        }
     }

    Let me know
    richard
  15. Rafael
    Rafael avatar
    32 posts
    Member since:
    Jul 2010

    Posted 14 Nov 2010 Link to this post

    Yes i did, but i'm not using the multiselect, just scrolling.

    Rafael
  16. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 14 Nov 2010 Link to this post

    Hi Rafael,

    If the above workaround isn't working for you (even without multiselect), please can you describe your situation in further detail and I will do my best to help.

    i have tried the workaround with multiselect turned off and it does seem to help any delay in scrolling.

    Best regards,
    Richard
  17. Rafael
    Rafael avatar
    32 posts
    Member since:
    Jul 2010

    Posted 14 Nov 2010 Link to this post

    I have a very simple scenario, no custom cells, 500 rows, 8 columns:

    List<WineSpectatorScore> result = WineSpectatorManager.GetLastestWinesImported();
    radGridViewWines.DataSource = result;
    radGridViewWines.MasterTemplate.BestFitColumns();

    I tried the
    radGridViewWines.Refresh();
    but it doesn't even get fired as i don't select rowns, i only scroll the list with the mouse.

    Rafael
  18. Rafael
    Rafael avatar
    32 posts
    Member since:
    Jul 2010

    Posted 14 Nov 2010 Link to this post

    even on the demos (customize/Conditional formating for ex), there a delay with mouse scrolling

    Rafael

    EDIT: i had a conditional formatting for a column, removed it but nothing changed)
  19. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 14 Nov 2010 Link to this post

    Hi Rafael,

    How are you scrolling with the mouse (I am trying to replicate your issue)
    E.g.
    + selecting a row, and then using the arrow on the vertical scrollbar
    + selecting a row, and using the mouse wheel
    + some other scenario?

    Thanks
    Richard
  20. Rafael
    Rafael avatar
    32 posts
    Member since:
    Jul 2010

    Posted 14 Nov 2010 Link to this post

    selecting a row, and using the mouse wheel
  21. Ramius
    Ramius avatar
    127 posts
    Member since:
    Feb 2008

    Posted 14 Nov 2010 Link to this post

    Hi Emanuel,

    why is unbound mode always slower than bound mode ?

    Regards,

    Ramius

  22. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 14 Nov 2010 Link to this post

    Hello Raymond,

    Glad to hear that your first issue with loading performance is now fixed by using DeferRefresh()

    With regard to your second issue, I believe that this will be helped by implementing the the above solution with RadGridView.Refresh() in SelectionChanged.

    Rafael,
    I can't replicate your issue with scrolling using the mouse wheel. On my system, the rows scroll two at a time and seems as fast (though not as smooth as it is scrolling two rows at a time).
    If you can post a sample to replicate the issue, I'll be happy to take a look.

    Richard
  23. Rafael
    Rafael avatar
    32 posts
    Member since:
    Jul 2010

    Posted 14 Nov 2010 Link to this post

    As a sample you can check the demos (customize/Conditional formating for ex).
    Do you notice a delay with mouse scrolling too?

    Rafael
  24. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 14 Nov 2010 Link to this post

    Hi,

    Yes, I can see that there is some delay when scrolling quickly through the records using the mouse wheel. In this case my advice would be to open a support ticket for this.

    Apologies I cannot offer a workaround this time.
    Richard
  25. Rafael
    Rafael avatar
    32 posts
    Member since:
    Jul 2010

    Posted 14 Nov 2010 Link to this post

    ok thanks! i'll do that :)
  26. Raymond
    Raymond avatar
    134 posts
    Member since:
    Jul 2010

    Posted 15 Nov 2010 Link to this post

    Hi

    I also reported this as bug becasue I have problems not only during using mouse wheel.

    Bug Report ID:366641 -- Scrolling sometimes doesn`t work or in other scenarion there is big lag
  27. Jack
    Admin
    Jack avatar
    2335 posts

    Posted 17 Nov 2010 Link to this post

    Hi guys,

    Thank you for reporting this issue.

    Yes, we found that the scrolling is slow in some cases (for example when using checkbox column). The issue is logged in our issue tracking system and we will try to address it in our upcoming service pack.

    Should you have any further questions, do not hesitate to ask.

    Best wishes,
    Jack
    the Telerik team
    See What's New in RadControls for WinForms in Q3 2010 on Wednesday, November 17, 11am Eastern Time: Register here>>
  28. Raymond
    Raymond avatar
    134 posts
    Member since:
    Jul 2010

    Posted 18 Nov 2010 Link to this post

    I cannot find this issue in PITS.

    http://www.telerik.com/support/pits.aspx#/public/winforms/2010-q3-sp+

    How can I track if this issue is fixed? Can you give me direct link?

    Reagrds
  29. Alexander
    Admin
    Alexander avatar
    306 posts

    Posted 18 Nov 2010 Link to this post

    Hello Raymond,

    The issues you reported are logged in PITS here: Scrolling and Multiselection. When a new item is created, it does not become visible immediately, but should be first synchronized with the PITS which may take some time. Feel free to follow the provided links in order to track the status of the issues.

    Best regards,
    Alexander
    the Telerik team
    See What's New in RadControls for WinForms in Q3 2010 on Wednesday, November 17, 11am Eastern Time: Register here>>
Back to Top
UI for WinForms is Visual Studio 2017 Ready