private wcInteractionFilter Add_FilterControl(bool isReCreate)
        {
            var dsFields = MyBI.Me.Get_DWColumn(this.WHCode)
                           .Where(p => p.Visible && p.DataType != "NUM" && !p.TblName_Virtual.Contains("DimTime"))
                           .Select(p => new COMCodeNameObj(p.ColName, p.ColAliasVI)).ToList();
            wcInteractionFilter ctrl = null;

            if (isReCreate)
            {
                foreach (string ctrlID in CtrlDashboardFilterIDs)
                {
                    ctrl           = this.LoadControl("wcInteractionFilter.ascx") as wcInteractionFilter;
                    ctrl.ID        = ctrlID;
                    ctrl.OnRemove += this.FilterCtrl_Remove;
                    ctrl.Set_Source(dsFields, "Code", "Name");
                    ctrl_DashboardFilters.Controls.Add(ctrl);
                }
                return(null);
            }
            var guiID = Guid.NewGuid().ToString().Replace("-", "_");

            ctrl           = this.LoadControl("wcInteractionFilter.ascx") as wcInteractionFilter;
            ctrl.ID        = string.Format("gen_{0}", guiID);
            ctrl.OnRemove += this.FilterCtrl_Remove;
            ctrl.Set_Source(dsFields, "Code", "Name");
            ctrl_DashboardFilters.Controls.Add(ctrl);
            CtrlDashboardFilterIDs.Add(ctrl.ID);
            return(ctrl);
        }
        protected void FilterCtrl_Remove(object sender, EventArgs e)
        {
            string ctrlID = (sender.GetVal("Parent") as Control).ID;

            CtrlDashboardFilterIDs.RemoveAll(p => p.Split(',', StringSplitOptions.RemoveEmptyEntries).First() == ctrlID);
            ctrl_DashboardFilters.Controls.RemoveAll(p => p.ID == ctrlID);
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            DashboardId = Get_Param(PageArgs.DashboardId);
            if (string.IsNullOrEmpty(DashboardId))
            {
                Page.Title = "New Dashboard";
                WHCode     = Get_Param(PageArgs.WHCode);
                if (!IsPostBack)
                {
                    // clean up session data
                    MySession.DashboardDefine_CurEditing = null;
                    MySession.DashboardDefine_UsingPortlet.Clear();
                    // clean up control value
                    txtDashboardName.Text = "";
                    TwoPane_1.Checked     = true;
                    Layout_Initialize(TwoPane_1.ID);
                    // clean up filters
                    ctrl_DashboardFilters.Controls.Clear();
                    CtrlDashboardFilterIDs.Clear();
                }
            }
            else
            {
                Page.Title = "Edit Dashboard";
                Dashboard  = MyBI.Me.Get_Dashboard().FirstOrDefault(db => db.ID == Int32.Parse(DashboardId));
                WHCode     = Dashboard.WHCode;
                if (!IsPostBack)
                {
                    txtDashboardName.Text = Dashboard.JsonObj.DisplayName;
                    // Layout style
                    RadioButton radio = Helpers.FindControlRecur(Page, Dashboard.JsonObj.Template) as RadioButton;
                    if (radio != null)
                    {
                        radio.Checked = true;
                        Layout_Initialize(radio.ID);
                    }

                    // Add Filter.
                    ctrl_DashboardFilters.Controls.Clear();
                    List <InteractionFilter> filters = Dashboard.JsonObj.Filters;
                    foreach (var item in filters)
                    {
                        var ctrl = this.Add_FilterControl(false);
                        ctrl.Set_FilterInfo(item);
                    }
                    MySession.DashboardDefine_CurEditing = Dashboard.Code;
                    // Default ?
                    chkDefault.Checked = Dashboard.IsDefault;
                }
            }
            if (IsPostBack)
            {
                ctrl_DashboardFilters.Controls.Clear();
                Add_FilterControl(true);

                if (!String.IsNullOrEmpty(Layout))
                {
                    Layout_Initialize(Layout);
                    int      c          = 0;
                    string[] postedKeys = Request.Form.AllKeys;
                    foreach (string key in postedKeys)
                    {
                        if (!string.IsNullOrEmpty(key) &&
                            key.EndsWith("$m_portletCandidate") &&
                            c <= 4)
                        {
                            m_selectedPortlets.Add(Request.Form[key]);
                            ++c;
                        }
                    }
                }
            }
        }