private void CreateMemHierarchy(short AxisOrdinal, HtmlTable hostTable, Member mem, bool HierIsAggregated, byte TreeDepth, bool autoSelect)
        {
            //do not display aggregate, display undlying calc members instead
            if (HierIsAggregated == true && mem.UniqueName == mem.Hierarchy.FilterMember.UniqueName)
            {
                MembersAggregate maggr = mem.Hierarchy.FilterMember as MembersAggregate;
                if (maggr != null)
                {
                    for (int i = 0; i < maggr.Members.Count; i++)
                    {
                        CalculatedMember cmem = maggr.Members[i] as CalculatedMember;
                        if (cmem != null)
                        {
                            this.CreateMemHierarchy(AxisOrdinal, hostTable, cmem, HierIsAggregated, TreeDepth, false);                             // recursion
                        }
                    }
                }
                return;
            }

            string       memIdentifier         = _contr.IdentifierFromSchemaMember(mem);
            string       hierIdentifier        = mem.Hierarchy.Axis.Ordinal.ToString() + ":" + mem.Hierarchy.Ordinal.ToString();
            bool         memIsSelected         = false;
            bool         memIsOpen             = false;
            bool         memIsPlaceholder      = false;
            bool         memAutoSelectChildren = (mem.Hierarchy.CalculatedMembers.GetMemberChildrenSet(mem.UniqueName) != null);
            SchemaMember smem = mem as SchemaMember;

            if (smem != null)
            {
                memIsOpen        = smem.IsOpen;
                memIsPlaceholder = smem.IsPlaceholder;
            }

            if (HierIsAggregated)
            {
                memIsSelected = (((MembersAggregate)mem.Hierarchy.FilterMember).Members[mem.UniqueName] != null?true:false);
            }
            else
            {
                memIsSelected = (mem.Hierarchy.GetMember(mem.UniqueName) != null);
            }

            HtmlTableRow  tr = new HtmlTableRow();
            HtmlTableCell td;

            System.Web.UI.WebControls.Button btn;
            Literal lit;

            // --- node contr col--
            td = new HtmlTableCell();
            td.Attributes.Add("class", "sel_C1");
            td.NoWrap = true;
            tr.Cells.Add(td);

            // --- node name col--
            td = new HtmlTableCell();

            lit = new Literal();
            for (int i = 0; i < TreeDepth; i++)
            {
                lit.Text = lit.Text + "&nbsp;&nbsp;";
            }
            td.Controls.Add(lit);

            if (memIsOpen)
            {
                btn          = new System.Web.UI.WebControls.Button();
                btn.ToolTip  = "Close";
                btn.ID       = "sel_close:" + memIdentifier;
                btn.CssClass = "sel_close";
                td.Controls.Add(btn);
            }
            else
            {
                if (mem.CanDrillDown)
                {
                    btn          = new System.Web.UI.WebControls.Button();
                    btn.ToolTip  = "Open";
                    btn.ID       = "sel_open:" + memIdentifier;
                    btn.CssClass = "sel_open";
                    td.Controls.Add(btn);
                }
                else
                {
                    // no image
                    lit.Text = lit.Text + "&nbsp;&nbsp;&nbsp;";
                }
            }


            if (memIsPlaceholder == false)
            {
                if (AxisOrdinal == 2 && HierIsAggregated == false)
                {
                    HtmlInputRadioButton radio = new HtmlInputRadioButton();
                    radio.Name            = "m:" + hierIdentifier;
                    radio.ID              = "m:" + memIdentifier;
                    radio.EnableViewState = false;
                    radio.Checked         = (memIsSelected || autoSelect);
                    radio.Disabled        = autoSelect;
                    radio.Attributes.Add("class", "sel_chk");
                    td.Controls.Add(radio);
                }
                else
                {
                    HtmlInputCheckBox chk = new HtmlInputCheckBox();
                    chk.ID = "m:" + mem.UniqueName;                   //note, UniqueName !
                    chk.EnableViewState = false;
                    chk.Checked         = (memIsSelected || autoSelect);
                    chk.Disabled        = autoSelect;
                    chk.Attributes.Add("class", "sel_chk");
                    td.Controls.Add(chk);
                }
            }

            lit      = new Literal();
            lit.Text = mem.Name;
            td.Controls.Add(lit);

            td.Attributes.Add("class", "sel_C");
            td.NoWrap = true;
            tr.Cells.Add(td);


            // --- node select col--
            td = new HtmlTableCell();

            if (AxisOrdinal != 2 && memIsOpen)
            {
                if (!memAutoSelectChildren)
                {
                    btn          = new System.Web.UI.WebControls.Button();
                    btn.ToolTip  = "Auto-Select Children";
                    btn.ID       = "sel_selauto:" + memIdentifier;
                    btn.CssClass = "sel_selauto";
                    td.Controls.Add(btn);

                    btn          = new System.Web.UI.WebControls.Button();
                    btn.ToolTip  = "Select Children";
                    btn.ID       = "sel_selall:" + memIdentifier;
                    btn.CssClass = "sel_selall";
                    td.Controls.Add(btn);
                }

                btn          = new System.Web.UI.WebControls.Button();
                btn.ToolTip  = "Deselect All Children";
                btn.ID       = "sel_deselall:" + memIdentifier;
                btn.CssClass = "sel_deselall";
                td.Controls.Add(btn);
            }

            td.Attributes.Add("class", "sel_C2");
            td.NoWrap = true;
            tr.Cells.Add(td);


            hostTable.Rows.Add(tr);


            if (memIsOpen == false)
            {
                return;
            }

            // next level members if it's schema member
            TreeDepth++;
            if (smem != null)
            {
                for (int j = 0; j < smem.Children.Count; j++)
                {
                    CreateMemHierarchy(AxisOrdinal, hostTable, smem.Children[j], HierIsAggregated, TreeDepth, memAutoSelectChildren);
                }
            }
        }