代码之家  ›  专栏  ›  技术社区  ›  ThunD3eR

如何防止Xtratreist中的列排序?

  •  0
  • ThunD3eR  · 技术社区  · 7 年前

    我正在使用devexpress,并且有一个具有多个列的树列表。

    默认情况下,数据按照客户要求以“升序”排序呈现。

    问题 :

    我有一个按钮应该禁用列排序。我要处理这两个属性:“ OptionsColumn.AllowSort “和 SortOrder . 问题是即使我设置了 OptionsColumn.AllowSort = false 更改列值时仍会触发排序,因为 排序顺序 属于 Ascending .

    我发现如果我改变 选项column.allowsort=false 排序顺序 None 这给了我想要的行为 但是 当我将SORTORDER更改为NONE时,这将触发一个混淆客户的排序。

    我想要什么:

    简单地说,我需要“冻结”排序,这意味着当用户单击“禁用排序”时,列表不会像将排序顺序更改为“无”时那样排序,它将保持原样,并且在更改值时,排序不应触发。

    代码

    解锁按钮 :

        private void DisableSorting_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            foreach (var c in xtlItemList.Columns)
            {
                c.OptionsColumn.AllowSort = false; // disable sorting on all columns
            }
    
            EnableSorting= false; // global variable indicating that the sorting shoult be disabled
    
        }
    

    树列表开始排序事件:

            private void xtlItemList_StartSorting(object sender, EventArgs e)
            {
                try
                {
    
                    var tree = (MatrixXTreeList)sender;
                    DevExpress.XtraTreeList.Columns.TreeListColumn col = tree.GetSortColumn(0);
    
                    if (EnableSorting == true) // if sorting enabled
                    {
    
                        var treeTest = (MatrixXTreeList)sender;
    
                        DevExpress.XtraTreeList.Columns.TreeListColumn col2 = treeTest.GetSortColumn(0);
    
    
                        if (col != null)
                            SetSortColumnID((MatrixXTreeList)sender, afterUpdate);
                        else
                        {
                            col.SortOrder = SortOrder.None;
                        }
                    }
    
                    else
                    {
                        col.SortOrder = SortOrder.None; // if sorting diabled, 
    //problem still triggers a sort since the SortOrder is changed from Ascending to None
                    }
                }
    
                catch (Exception ex)
                {
    
                }
            }
    

    我如何完成所期望的行为?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Svetlana    7 年前

    这个 OptionsColumn.AllowSort 帮助文章描述此属性仅启用/禁用最终用户功能。这就是为什么期望TreeList的节点仍然按照更改的单元格值排序的原因。 如果需要禁用排序功能但按当前顺序显示节点,我建议您基于保留当前节点顺序的现有数据源创建新的数据源。然后,将此新数据源分配给树列表,并将SortOrder属性设置为“无”。打开排序功能后,将原始数据源分配给控件。

        2
  •  0
  •   ThunD3eR    7 年前

    多亏了@svetlana我才解决了这个问题。解决方法如下:

    首先,我希望保持列值不变,因此我通过执行以下操作实现了这一点:

           public List<string> myValues= new List<string>();
    
            int count = xtlItemList.Nodes.Count; // number of nodes in three
    
            for (int i = 0; i < count; i++)
            {
                var columnID1 = xtlItemList.Columns[2]; // get the column with index of 2
                var cellValue = xtlItemList.Nodes[i][columnID1]; // get value
    
                myStrings.Add(cellValue.ToString()); // save value
            }
    
            // change sort order
    
            xtlItemList.BeginSort();
            xtlItemList.Columns[2].SortOrder = SortOrder.None;
            xtlItemList.EndSort();
    
            // return the values
            for (int i = 0; i < myStrings.Count; i++)
            {
                var columnID1 = xtlItemList.Columns[2];
                xtlItemList.Nodes[i].SetValue(columnID1, myStrings[i]);
            }
    

    然而

    上面的内容是错误的,因为我给每一行的值都是错误的。由于排序已更改,因此重新排列了行,因此值不属于相应的已排序行。

    我通过将节点保存在列表中,然后在排序后设置节点的位置来解决这个问题,如下所示:

            int count = xtlItemList.Nodes.Count;
    
            List<TreeListNode> nodes = new List<TreeListNode>();
            nodes.AddRange(xtlItemList.Nodes); // save the nodes with their position
    
            xtlItemList.BeginSort();
            xtlItemList.Columns[2].SortOrder = SortOrder.None;
            xtlItemList.EndSort();
    
            for (int i = 0; i < nodes.Count; i++)
            {
                xtlItemList.SetNodeIndex(nodes[i], i); // set nodes to the original position
            }