Как предотвратить сортировку столбцов в XtraTreeList? - PullRequest
0 голосов
/ 09 января 2019

Я использую devexpress и у меня есть список с несколькими столбцами.

Данные обрабатываются с сортировкой по возрастанию по умолчанию в соответствии с требованиями заказчика.

Задача

У меня есть кнопка, которая должна отключить сортировку столбцов. У меня есть два свойства для работы: "OptionsColumn.AllowSort" и SortOrder. Проблема в том, что, хотя я установил OptionsColumn.AllowSort = false, сортировка по-прежнему запускается при изменении значений столбца, поскольку у меня SortOrder равно Ascending.

Я обнаружил, что если я изменю OptionsColumn.AllowSort = false и SortOrder на None, это дает мне желаемое поведение НО , когда я изменяю sortOrder на None, это вызывает сортировку, которая сбивает с толку клиента.

Что я хочу:

Проще говоря, мне нужно «заморозить» сортировку, что означает, что когда пользователь нажимает «DisableSorting», список не будет сортировать, как при изменении sortOrder на «none». Он просто останется таким, как есть, и при изменении значения, сортировка не должен срабатывать.

код

DisableButton :

    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

    }

Событие startSorting TreeList:

        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 ]

0 голосов
/ 09 января 2019

Благодаря @ Светлане мне удалось решить эту проблему. Решение заключается в следующем:

Сначала я искал значения столбца как есть, поэтому я достиг этого, выполнив следующее:

       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
        }
0 голосов
/ 09 января 2019

Справочная статья OptionsColumn.AllowSort описывает, что это свойство включает / отключает только возможности конечного пользователя. Вот почему ожидается, что узлы TreeList по-прежнему сортируются при изменении значений ячеек. Если вам нужно отключить возможности сортировки, но показывать узлы в текущем порядке, я предлагаю вам создать новый источник данных на основе существующего, сохраняя текущий порядок узлов. Затем назначьте этот новый источник данных вашему TreeList и установите для свойства SortOrder значение None. При включении возможностей сортировки назначьте исходный источник данных для элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...