public void /* ITreeGridDesignerColumnHost */ Invalidate(object tracking)
        {
            if (!_containerControl.WatermarkVisible)
            {
                if (tracking == null)
                {
                    _treeControl.Invalidate();
                }
                else if (TreeProvider.VisibleItemCount > 0)
                {
                    if (TreeGridDesignerBranch.InVirtualTreeEdit)
                    {
                        // a common case here is that an event handler calls this due to an edit made in the tree itself,
                        // so we look for that and don't refresh if that is the case, as it is unnecessary.
                        var itemInfo = _treeControl.SelectedItemInfo;
                        if (itemInfo.Branch != null)
                        {
                            var options         = 0;
                            var currentTracking = itemInfo.Branch.GetObject(
                                itemInfo.Row, itemInfo.Column, ObjectStyle.TrackingObject, ref options);
                            if (tracking.Equals(currentTracking))
                            {
                                return;
                            }
                        }
                    }

                    // search visible rows only
                    var startIndex = _treeControl.TopIndex;

                    var itemHeight      = (int)NativeMethods.SendMessage(_treeControl.Handle, NativeMethods.LB_GETITEMHEIGHT, 0, 0);
                    var endIndex        = TreeProvider.VisibleItemCount;
                    var endVisibleIndex = startIndex + 1 + ((_treeControl.Height > 0) ? (_treeControl.Height / itemHeight) : 0);
                    if (endVisibleIndex < endIndex)
                    {
                        endIndex = endVisibleIndex;
                    }

                    var itemEnumerator = TreeProvider.EnumerateColumnItems(0, _treeControl.ColumnPermutation, false, startIndex, endIndex);

                    IBranch currentBranch = null;
                    while (itemEnumerator.MoveNext())
                    {
                        // just make a single call into each branch to locate the object
                        if (itemEnumerator.Branch != null &&
                            itemEnumerator.Branch != currentBranch)
                        {
                            currentBranch = itemEnumerator.Branch;

                            var locateData = currentBranch.LocateObject(tracking, ObjectStyle.TrackingObject, 0);

                            if (locateData.Options == (int)TrackingObjectAction.ThisLevel)
                            {
                                // found it
                                _treeControl.InvalidateItem((itemEnumerator.RowInTree - itemEnumerator.RowInBranch) + locateData.Row);
                                break;
                            }
                        }
                    }
                }
            }
        }