【问题标题】:How to prevent column sorting in XtraTreeList?如何防止 XtraTreeList 中的列排序?
【发布时间】:2019-01-09 09:53:24
【问题描述】:

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

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

问题

我有一个按钮可以禁用列的排序。我有这两个属性可以使用: "OptionsColumn.AllowSort" 和 SortOrder 。问题是即使我设置了OptionsColumn.AllowSort = false,在更改列值时仍然会触发排序,因为我有SortOrderAscending

我发现如果我将 OptionsColumn.AllowSort = falseSortOrder 更改为 None 这会给我想要的行为但是当我将 sortOrder 更改为 None 时这会触发一个让客户感到困惑的排序.

我想要什么:

简单地说,我需要“冻结”排序,这意味着当用户单击“DisableSorting”时,列表不会像将 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

    }

treeList startSorting 事件:

        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)
            {

            }
        }

如何实现期望的行为?

【问题讨论】:

    标签: c# .net winforms sorting devexpress


    【解决方案1】:

    OptionsColumn.AllowSort 帮助文章描述了此属性仅启用/禁用最终用户功能。这就是为什么预计 TreeList 的节点仍会根据单元格值的变化进行排序。 如果您需要禁用排序功能但按当前顺序显示节点,我建议您在现有数据源的基础上创建一个新的数据源,保持当前节点顺序。然后,将此新数据源分配给您的 TreeList 并将 SortOrder 属性设置为 None。开启排序功能后,将原始数据源分配给控件。

    【讨论】:

    • 有趣的想法,我试试看
    • 接受这个答案,请在下面查看我的详细答案。
    【解决方案2】:

    感谢@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
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2015-10-04
      • 2019-10-10
      • 2013-03-21
      相关资源
      最近更新 更多