Search code examples
vb.netwinformsobjectlistview

FastObjectListView UpdateObject() randomly reorders rows within primary sort


  1. Data is a generic List of domain objects.
  2. I click the "Deploy Status" column header to sort on that column.
  3. I have a button that does nothing more than folv.UpdateObject(someObject) .
  4. Every time I press that button, the Deploy Status column maintains its sort, but all rows within the sorted blocks are randomly reordered, as per screenshot.

I have commented out everything in the form's code beyond loading the data, the test button, and the FastObjectListView's column.Add() and .SetObjects(). There are no event handlers wired up for the FastObjectListView. I am not setting PrimarySort or SecondarySort in code; only by clicking with the mouse.

random reordering


Solution

  • You should be able to fix this problem by either calling Sort after your button's call to UpdateObject or changing your usage of UpdateObject to RefreshObject

    Reproducing the problem (C# Repro for the issue in the API)

    This seems to reproduce the problem you are having. Run the code, sort the Other column ascending. Click the update button.

    public class MainForm : Form
    {
        public MainForm()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
            // 
            // MainForm
            // 
            this.ClientSize = new System.Drawing.Size(300, 300);
            this.Name = "MainForm";
            this.ResumeLayout(false);
            this.PerformLayout();
    
            var OLVa = new FastObjectListView();
            OLVa.Width = 250;
            OLVa.Height = 250;
            OLVa.Columns.Add(new OLVColumn("ID", "ID"));
            OLVa.Columns.Add(new OLVColumn("Other", "Other"));
    
            var l1 = new lolz(1, 3);
    
            OLVa.AddObject(l1);
            OLVa.AddObject(new lolz(2,3));
    
            this.Controls.Add(OLVa);
            var btn = new Button()
            {
                Text = "Update",
                Top = OLVa.Bottom
            };
            btn.Click += (s,e)=>OLVa.UpdateObject(l1);
    
            this.Controls.Add(btn);
        }
    
        private class lolz
        {
            public int ID;
            public int Other;
    
            public lolz(int id, int other)
            {
                ID = id;
                Other = other;
            }
        }
    }
    

    Fixing the problem

    The following would fix it for the above example:

    btn.Click += (s,e)=>
                {
                    OLVa.BeginUpdate();
                    try
                    {
                        OLVa.UpdateObject(l1);
                        OLVa.Sort();
                    }
                    finally
                    {
                        OLVa.EndUpdate();
                    }
                };