Редактирование ячейки TreeListView ObjectListView очень медленно

Я использую TreeListView (ObjectListView) http://objectlistview.sourceforge.net/cs/index.html — и заполнил его несколькими элементами.

Один из столбцов я сделал редактируемым по двойному щелчку для пользовательского ввода.

К сожалению, редактирование происходит очень медленно, и переход от редактирования одной ячейки в столбце Кол-во (см. рисунок ниже) к редактированию следующей ячейки занимает около 5–10 секунд каждый раз. Кроме того, редактор ячеек появляется и исчезает через некоторое время.

Ниже приведен код, который я использую для заполнения TreeListView:

        TreeListView.TreeRenderer renderer = this.treeListView.TreeColumnRenderer;
        renderer.LinePen = new Pen(Color.Firebrick, 0.5f);
        renderer.LinePen.DashStyle = DashStyle.Solid;
        renderer.IsShowLines = true;

        treeListView.RowFormatter = delegate(OLVListItem olvi)
        {
            var item = (IListView)olvi.RowObject;
            if (item.ItemType == "RM")
                olvi.ForeColor = Color.LightSeaGreen;
        };

        treeListView.CanExpandGetter = delegate(object x)
        {
            var job = x as IListView;
            if (job != null)
            {
                if (job.ItemType == "PA" || job.ItemType == "JC")
                {
                     var rm = job.ItemPart.GetRawMaterial();
                    var subParts = job.ItemPart.SubParts.Where(v => v != null).ToList();
                    if (rm.Count > 0|| subParts.Count > 0)//
                        return true;


                }


            }

                return false;
        };


        this.treeListView.ChildrenGetter = delegate(object x)
        {
            try
            {
                var job = x as IListView;
                if (job != null)
                {
                    if (job.ItemType == "PA" || job.ItemType == "JC")
                    {
                        var part = job.ItemPart;
                        var rm = part.GetRawMaterial();
                        var subParts = part.SubParts.Where(v => v != null).ToList();
                        var items = new List<IListView>();

                        items.AddRange(subParts.GetRange(0, subParts.Count).ToList<IListView>());
                        items.AddRange(rm.GetRange(0, rm.Count).ToList<IListView>());
                        return items;
                    }

                }
                return null;

            }
            catch (UnauthorizedAccessException ex)
            {
                MessageBox.Show(this, ex.Message, "ObjectListViewDemo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return null;
            }
        };
        var lItems= jobs.ToList<IListView>();
        treeListView.SetObjects(lItems );


        Expand(lItems[0]);
        treeListView.RebuildAll(true);

    }

    public void Expand(object expItem)
    {
       treeListView.ToggleExpansion(expItem);

        foreach (var item in treeListView.GetChildren(expItem))
        {
            Expand(item);
        }

    }


Вот изображение редактирования ячейки:

введите здесь описание изображения

Почему редактирование идет так медленно? Я делаю что-то неправильно? Что я могу сделать, чтобы сделать это быстрее?


person Ewald Stieger    schedule 09.06.2012    source источник
comment
Вы уже нашли решение? Я застрял с той же проблемой! Был бы признателен за помощь!   -  person nozzleman    schedule 16.09.2015


Ответы (1)


В ваших делегатах вы используете линейный поиск и несколько копий списка (также линейных). И это по каждому пункту. Следует ожидать плохой производительности.

Если вы хотите улучшить это, вы можете вместо этого предварительно рассчитать результаты.

person Illishar    schedule 16.01.2017