首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止XtraTreeList中的列排序?

如何防止XtraTreeList中的列排序?
EN

Stack Overflow用户
提问于 2019-01-09 09:53:24
回答 1查看 475关注 0票数 0

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

默认情况下,每个客户需求都使用“升序”排序来呈现数据。

问题

我有一个按钮应该禁用列的排序。我使用这两个属性:"OptionsColumn.AllowSort“和SortOrder。问题是,即使我设置了OptionsColumn.AllowSort = false,但由于我有一个SortOrder of Ascending,所以在更改列值时仍然会触发一个排序。

我发现,如果我将OptionsColumn.AllowSort = falseSortOrder更改为None,这将给出所需的行为,但当将sortOrder更改为None时,会触发一种使客户感到困惑的排序。

我想要的:

简单地说,我需要“冻结”排序,这意味着当用户单击"DisableSorting“时,列表将不像将sortOrder更改为"none”时一样,它将保持原样,并且当更改排序不应该触发的值时。

代码

DisableButton:

代码语言:javascript
复制
    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事件:

代码语言:javascript
复制
        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)
            {

            }
        }

我如何完成期望的行为?

EN

回答 1

Stack Overflow用户

发布于 2019-01-09 13:45:41

多亏@Svetlana,我设法解决了这个问题。解决办法如下:

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

代码语言:javascript
复制
       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]);
        }

然而,

以上内容可能是错误的,因为我会给每一行提供错误的值。由于排序被更改,所以行被重新排列,因此这些值不属于相应的排序行。

我解决了这个问题,方法是将节点保存在列表中,然后在排序之后设置节点的位置,如下所示:

代码语言:javascript
复制
        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
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54107322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档