private void AddMenuItems(int currGroupIndex, ref int currentListIndex, ToolStripItemCollection currNodes, string prevGroupByField)
            {
                IList innerList = this.m_currencyManager.List;
                System.ComponentModel.PropertyDescriptor pdPrevGroupBy = null;
                string prevGroupByValue = null;

                SPTreeNodeGroup currGroup;

                if (prevGroupByField != "")
                {
                    pdPrevGroupBy = this.m_currencyManager.GetItemProperties()[prevGroupByField];
                }

                currGroupIndex++;

                if (treeGroups.Count > currGroupIndex)
                {
                    currGroup = (SPTreeNodeGroup) (treeGroups[currGroupIndex]);
                    PropertyDescriptor pdGroupBy = null;
                    PropertyDescriptor pdValue = null;
                    PropertyDescriptor pdDisplay = null;

                    pdGroupBy = this.m_currencyManager.GetItemProperties()[currGroup.GroupBy];
                    pdValue = this.m_currencyManager.GetItemProperties()[currGroup.ValueMember];
                    pdDisplay = this.m_currencyManager.GetItemProperties()[currGroup.DisplayMember];

                    string currGroupBy = null;

                    if (innerList.Count > currentListIndex)
                    {
                        if (pdPrevGroupBy != null)
                        {
                            prevGroupByValue = pdPrevGroupBy.GetValue(innerList[currentListIndex]).ToString();
                        }

                        SPMenuStripItem myFirstNode = null;
                        object currObject = null;

                        while ((currentListIndex < innerList.Count) && (pdPrevGroupBy != null) && (pdPrevGroupBy.GetValue(innerList[currentListIndex]).ToString() == prevGroupByValue))
                        {
                            currObject = innerList[currentListIndex];
                            if (pdGroupBy.GetValue(currObject).ToString() != currGroupBy)
                            {
                                currGroupBy = pdGroupBy.GetValue(currObject).ToString();

                                myFirstNode = new SPMenuStripItem(currGroup.Name, pdDisplay.GetValue(currObject).ToString(), currObject, pdValue.GetValue(innerList[currentListIndex]), currGroup.ImageIndex, currentListIndex);

                                currNodes.Add(myFirstNode);
                            }
                            else
                            {
                                AddMenuItems(currGroupIndex, ref currentListIndex, this.Items, currGroup.GroupBy);
                            }
                        }
                    }
                }
                else
                {
                    SPMenuStripItem myNewLeafNode;
                    object currObject = this.m_currencyManager.List[currentListIndex];

                    if ((this.DisplayMember != null) && (this.ValueMember != null) && (this.DisplayMember != "") && (this.ValueMember != ""))
                    {
                        PropertyDescriptor pdDisplayloc = this.m_currencyManager.GetItemProperties()[this.DisplayMember];
                        PropertyDescriptor pdValueloc = this.m_currencyManager.GetItemProperties()[this.ValueMember];

                        if (this.Tag == null)
                        {
                            myNewLeafNode = new SPMenuStripItem("", pdDisplayloc.GetValue(currObject).ToString(), currObject, pdValueloc.GetValue(currObject), currentListIndex);
                        }
                        else
                        {
                            myNewLeafNode = new SPMenuStripItem(this.Tag.ToString(), pdDisplayloc.GetValue(currObject).ToString(), currObject, pdValueloc.GetValue(currObject), currentListIndex);
                        }
                    }
                    else
                    {
                        myNewLeafNode = new SPMenuStripItem("", currentListIndex.ToString(), currObject, currObject, currentListIndex, currentListIndex);
                    }

                    currNodes.Add(myNewLeafNode);
                    currentListIndex++;
                }
            }
            public void BuildTree()
            {
                this.Items.Clear();
                if ((this.m_currencyManager != null) && (this.m_currencyManager.List != null))
                {
                    IList innerList = this.m_currencyManager.List;
                    ToolStripItemCollection currNode = this.Items;
                    int currGroupIndex = 0;
                    int currListIndex = 0;

                    if (this.treeGroups.Count > currGroupIndex)
                    {
                        SPTreeNodeGroup currGroup = (SPTreeNodeGroup) (treeGroups[currGroupIndex]);
                        SPMenuStripItem myFirstNode = null;
                        PropertyDescriptor pdGroupBy;
                        PropertyDescriptor pdValue;
                        PropertyDescriptor pdDisplay;

                        pdGroupBy = this.m_currencyManager.GetItemProperties()[currGroup.GroupBy];
                        pdValue = this.m_currencyManager.GetItemProperties()[currGroup.ValueMember];
                        pdDisplay = this.m_currencyManager.GetItemProperties()[currGroup.DisplayMember];

                        string currGroupBy = null;
                        if (innerList.Count > currListIndex)
                        {
                            object currObject;
                            while (currListIndex < innerList.Count)
                            {
                                currObject = innerList[currListIndex];
                                if (pdGroupBy.GetValue(currObject).ToString() != currGroupBy)
                                {
                                    currGroupBy = pdGroupBy.GetValue(currObject).ToString();

                                    myFirstNode = new SPMenuStripItem(currGroup.Name, pdDisplay.GetValue(currObject).ToString(), currObject, pdValue.GetValue(innerList[currListIndex]), currGroup.ImageIndex, currListIndex);

                                    currNode.Add((ToolStripItem) myFirstNode);
                                }
                                else
                                {
                                    AddMenuItems(currGroupIndex, ref currListIndex, this.Items, currGroup.GroupBy);
                                }
                            } // end while
                        } // end if
                    }
                    else
                    {
                        while (currListIndex < innerList.Count)
                        {
                            AddMenuItems(currGroupIndex, ref currListIndex, this.Items, "");
                        }
                    } // end else

                } // end if
            }