/// <summary>
        /// Raises the GetNextDataBlock event
        /// </summary>
        /// <param name="args"></param>
        private void OnGetNextDataBlock(GetNextNodeDataBlockEventArgs args)
        {
            if (!mRaiseEventsFlag)
            {
                return;
            }

            EventHandler<GetNextNodeDataBlockEventArgs> handler = GetNextDataBlock;

            if (handler != null)
            {
                handler(this, args);
            }
        }
        /// <summary>
        /// Process the GetNextDataBlock event from the Tree. Finds the corresponding next data block
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void ProcessTreeGetNextDataBlock(object sender, GetNextNodeDataBlockEventArgs e)
        {
            List<KeyValuePair<string, Oid>> lOidPathList = new List<KeyValuePair<string, Oid>>(e.CompleteOidPath);

            IUQueryContext queryContext = null;
            if (IsRootNode(lOidPathList))
            {
                TreeNodeController lNodeController = GetNodeById(lOidPathList[0].Key);
                if (lNodeController == null)
                {
                    return;
                }
                queryContext = lNodeController.QueryContext;
            }
            else
            {
                lOidPathList.Reverse();
                queryContext = UpdateAllNodeContextInformation(lOidPathList);
            }

            if (queryContext == null)
            {
                return;
            }

            // Get the DisplaySetInformation from the node controller.
            TreeNodeController treeNodeController = this.GetNodeById(e.NodeId);
            DisplaySetInformation lDisplaySetInfo = treeNodeController.DisplaySetInfo;

            DataTable lData = null;
            lData = GetNextDataBlock(queryContext, e.LastOid);

            // Send the DisplaySetInformation in the event arguments.
            e.DisplaySetInfo = lDisplaySetInfo;
            e.Data = lData;
            e.LastBlock = IsLastBlock(queryContext);
        }
        /// <summary>
        /// Executes the selected node processing.
        /// </summary>
        /// <param name="treeNode">TreeView node.</param>
        private void ProcessNodeSelected(TreeNode treeNode)
        {
            InstanceNodeInfo lInstanceInfo = null;
            List<KeyValuePair<string, Oid>> lCompleteOidPath = GetCompleteOidPath(treeNode);

            // Next block of instances
            if (treeNode.Text.Equals("..."))
            {
                // Get the last Oid
                Oid lLastOid = null;
                if (treeNode.PrevNode != null && treeNode.PrevNode.Tag != null)
                {
                    lInstanceInfo = treeNode.PrevNode.Tag as InstanceNodeInfo;
                    if (lInstanceInfo != null)
                    {
                        lLastOid = lInstanceInfo.InstanceOid;
                    }
                }

                GetNextNodeDataBlockEventArgs getNextBlockArgs = new GetNextNodeDataBlockEventArgs(treeNode.Name, lLastOid, lCompleteOidPath);
                OnGetNextDataBlock(getNextBlockArgs);
                TreeNode parentNode = treeNode.Parent;
                // Delete the special node
                mRaiseEventsFlag = false;
                mTreeViewIT.Nodes.Remove(treeNode);
                mRaiseEventsFlag = true;
                // Add the received data to the parent node
                AddDataToNode(parentNode,treeNode.Name, getNextBlockArgs.Data, getNextBlockArgs.DisplaySetInfo, getNextBlockArgs.LastBlock, false);
                return;
            }

            // Instance or intermadia node ?

            // Raise the proper selected event
            if (treeNode.Tag != null && (treeNode.Tag as InstanceNodeInfo) != null)
            {
                ProcessInstanceNodeSelected(treeNode);
            }
            else
            {
                ProcessNoInstanceNodeSelected(treeNode);
            }
            mTreeViewIT.Focus();
        }
 /// <summary>
 /// Executes actions related to getting next DataBlock.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void HandleTreeGetNextDataBlock(object sender, GetNextNodeDataBlockEventArgs e)
 {
     ProcessTreeGetNextDataBlock(sender, e);
 }