/// <summary>
        /// Handles the DragDrop event. Add a new grouping column following a drag drop from the grid
        /// </summary>
        /// <param name="sender">Source of the event.</param>
        /// <param name="e">A DragEventArgs that contains the event data.</param>
        private void KryptonOutlookGridGroupBox_DragDrop(object sender, DragEventArgs e)
        {
            string    columnToMove = e.Data.GetData(typeof(string)) as string;
            string    columnName;
            string    columnText;
            SortOrder sortOrder;

            string[] res = columnToMove.Split('|');
            columnName = res[0];
            columnText = res[1];
            sortOrder  = SortOrder.Ascending;
            OutlookGridGroupBoxColumn colToAdd = new OutlookGridGroupBoxColumn(columnName, columnText, sortOrder);

            if (!String.IsNullOrEmpty(columnToMove) && !columnsList.Contains(colToAdd))
            {
                columnsList.Add(colToAdd);

                try
                {
                    //Warns the grid of a new grouping
                    OnColumnGroupAdded(new OutlookGridColumnEventArgs(new OutlookGridColumn(columnName, null, null, SortOrder.None, true)));
                    this.Invalidate();
                }
                catch (Exception exc)
                {
                    MessageBox.Show("Failed to group.\n\n Error:" + exc.Message,
                                    "Grid GroupBox",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                }
            }
        }
        /// <summary>
        /// Handles the UnGroup event
        /// </summary>
        /// <param name="sender">Source of the event.</param>
        /// <param name="e">A EventArgs that contains the event data.</param>
        private void OnUngroup(object sender, EventArgs e)
        {
            OutlookGridGroupBoxColumn col = columnsList[indexselected];

            OnColumnGroupRemoved(new OutlookGridColumnEventArgs(new OutlookGridColumn(col.ColumnName, null, null, SortOrder.None, false)));
            columnsList.Remove(col);
            this.Invalidate();
        }
        /// <summary>
        /// Handles the SortDescending event
        /// </summary>
        /// <param name="sender">Source of the event.</param>
        /// <param name="e">A EventArgs that contains the event data.</param>
        private void OnSortDescending(object sender, EventArgs e)
        {
            OutlookGridGroupBoxColumn col = columnsList[indexselected];

            col.SortOrder = SortOrder.Descending;
            OnColumnSortChanged(new OutlookGridColumnEventArgs(new OutlookGridColumn(col.ColumnName, null, null, SortOrder.Descending, false)));
            this.Invalidate();
        }
        /// <summary>
        /// DO NOT USE THIS FUNCTION YOURSELF, USE the corresponding function in OutlookGrid
        /// Update the grouping columns.
        /// </summary>
        /// <param name="list">The list of OutlookGridColumn</param>
        public void UpdateGroupingColumns(List <OutlookGridColumn> list)
        {
            columnsList.Clear();
            OutlookGridGroupBoxColumn colToAdd;

            for (int i = 0; i < list.Count; i++)
            {
                if (list[i].IsGrouped)
                {
                    colToAdd = new OutlookGridGroupBoxColumn(list[i].DataGridViewColumn.Name, list[i].DataGridViewColumn.HeaderText, list[i].SortDirection);
                    columnsList.Add(colToAdd);
                }
            }
            this.Invalidate();
        }
        /// <summary>
        /// Show the context menu for column box
        /// </summary>
        private void ShowColumnBoxContextMenu()
        {
            if (_menuItems == null)
            {
                // Create individual items
                _menuSortAscending  = new KryptonContextMenuItem("SORTASCENDING", new EventHandler(OnSortAscending));
                _menuSortDescending = new KryptonContextMenuItem("SORTDESCENDING", new EventHandler(OnSortDescending));
                _menuUnGroup        = new KryptonContextMenuItem("UNGROUP", new EventHandler(OnUngroup));
                _menuSeparator1     = new KryptonContextMenuSeparator();
                _menuFullExpand     = new KryptonContextMenuItem("FULLEXPAND", new EventHandler(OnFullExpand));
                _menuFullCollapse   = new KryptonContextMenuItem("FULLCOLLAPSE", new EventHandler(OnFullCollapse));
                _menuSeparator2     = new KryptonContextMenuSeparator();
                _menuClearGrouping  = new KryptonContextMenuItem("CLEARGROUPING", new EventHandler(OnClearGrouping));
                _menuHideGroupBox   = new KryptonContextMenuItem("HIDEGROUPBOX", null, new EventHandler(OnHideGroupBox));

                // Add items inside an items collection (apart from separator1 which is only added if required)
                _menuItems = new KryptonContextMenuItems(new KryptonContextMenuItemBase[] { _menuSortAscending,
                                                                                            _menuSortDescending,
                                                                                            _menuUnGroup,
                                                                                            _menuSeparator1,
                                                                                            _menuFullExpand,
                                                                                            _menuFullCollapse,
                                                                                            _menuSeparator2,
                                                                                            _menuClearGrouping,
                                                                                            _menuHideGroupBox });
            }

            // Ensure we have a krypton context menu if not already present
            if (this.KCtxMenu == null)
            {
                KCtxMenu = new KryptonContextMenu();
            }


            // Update the individual menu options
            OutlookGridGroupBoxColumn col = null;

            if (indexselected > -1)
            {
                col = columnsList[indexselected];
            }

            _menuSortAscending.Visible  = col != null;
            _menuSortDescending.Visible = col != null;
            _menuSortAscending.Checked  = col != null && col.SortOrder == SortOrder.Ascending;
            _menuSortDescending.Checked = col != null && col.SortOrder == SortOrder.Descending;
            _menuUnGroup.Visible        = col != null;
            _menuFullExpand.Enabled     = columnsList.Count > 0;
            _menuFullCollapse.Enabled   = columnsList.Count > 0;
            _menuClearGrouping.Enabled  = columnsList.Count > 0;


            _menuSeparator1.Visible = (_menuSortAscending.Visible || _menuSortDescending.Visible || _menuUnGroup.Visible);

            if (!KCtxMenu.Items.Contains(_menuItems))
            {
                KCtxMenu.Items.Add(_menuItems);
            }

            // Show the menu!
            KCtxMenu.Show(this);
        }