FastObjectListView UpdateObject() 在主要排序中随机重新排序行

FastObjectListView UpdateObject() randomly reorders rows within primary sort

  1. 数据是域 objects 的通用列表。
  2. 我单击 "Deploy Status" 列 header 对该列进行排序。
  3. 我有一个按钮,它只做 folv.UpdateObject(someObject) .
  4. 每次我按下该按钮时,“部署状态”列都会保持其排序,但排序块中的所有行都会随机重新排序,如屏幕截图所示。

除了加载数据、测试按钮和 FastObjectListView 的 column.Add() 和 .SetObjects() 之外,我已经注释掉了表单代码中的所有内容。没有为 FastObjectListView 连接的事件处理程序。我没有在代码中设置 PrimarySort 或 SecondarySort;只需用鼠标点击即可。

您应该可以通过在按钮调用 UpdateObject 之后调用 Sort 或将 UpdateObject 的用法更改为 RefreshObject[=16 来解决此问题=]

重现问题(C# Repro for the issue in the API)

这似乎重现了您遇到的问题。 运行 代码,对其他列进行升序排序。单击更新按钮。

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

正在解决问题

下面将针对上面的示例修复它:

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