This is a migrated thread and some comments may be shown as answers.

Self Referencing Grid Expand/Collapse problem with dynamic grid creation

2 Answers 157 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Chris Rickert
Top achievements
Rank 1
Chris Rickert asked on 27 Apr 2009, 10:01 PM
Hi.  I've searched the forums and cannot find a solution to this problem.  Hopefully I did not miss something.

I have created a self-referencing grid completely in the code behind.  Everything works great except when I collapse a section, I cannot get it to re-appear when I click the +.  The page reloads but stays in the exact same state as previously. 

So, I guess I'm trying to figure out what code is actually making the child tables display or hide.  It does not seem like they are being generated, but I cannot figure out why they would not be generated. 

This is my ASCX file:
<div id="myCoursesPage">  
    <asp:PlaceHolder ID="phCatalog" runat="server" /> 
</div> 

This is my C# code-behind which generates everything:
public partial class modules_MyCourses_admin_ManageCurricula_ucShowCatalog : System.Web.UI.UserControl  
{  
    CurriculaManager CM = new CurriculaManager();  
    DataSet catalogDS = null;  
    HtmlGenericControl CatalogHeader = null;  
    HtmlGenericControl CatalogDiv = null;  
    GridControl currentGrid = null;  
 
 
    private bool _showUnassigned = true;  
    public bool ShowUnassigned  
    {  
        get 
        {  
            return _showUnassigned;  
        }  
        set 
        {  
            _showUnassigned = value;  
        }  
    }  
 
    protected void Page_Load(object sender, EventArgs e)  
    {  
        this.Page.PreRenderComplete += new EventHandler(Page_PreRenderComplete);  
          
        if (catalogDS == null)  
        {  
            GetDataset();  
            Session["CatalogGridSource"] = catalogDS;  
        }  
 
        LoadCatalog(catalogDS);  
       
 
    }  
 
    protected void Page_PreRenderComplete(object sender, EventArgs e)  
    {  
        foreach (Control ctrl in phCatalog.Controls)  
        {  
            foreach (Control ctrldiv in ctrl.Controls)  
            {  
                if (ctrldiv.ID.StartsWith("CatalogGrid_"))  
                {  
                    RadGrid catalog = ctrldiv as RadGrid;  
                    HideExpandColumnRecursive(catalog.MasterTableView);  
                }  
            }  
        }  
 
    }  
 
 
    public void GetDataset()  
    {  
        catalogDS = CM.ClassificationsGetCatalogList(((PortalPage)this.Page).UsePortalID, Convert.ToInt32(Session["UserID"]), 1);  
    }  
 
    protected void CatalogGrid_ColumnCreated(object sender, GridColumnCreatedEventArgs e)  
    {  
        if (e.Column is GridExpandColumn)  
        {  
            e.Column.Visible = false;  
        }  
        //else if (e.Column is GridBoundColumn)  
        //{  
        //    e.Column.HeaderStyle.Width = Unit.Pixel(100);  
        //}  
 
        if (e.Column is GridBoundColumn || e.Column is GridTemplateColumn)  
        {  
            e.Column.HeaderStyle.Width = Unit.Pixel(100);  
        }  
 
    }  
 
 
    private void CreateGrid(int CatalogID)  
    {  
        currentGrid = new GridControl();  
        currentGrid.EnableEmbeddedSkins = false;  
        currentGrid.Skin = "Default";  
        currentGrid.EnableViewState = false;  
        currentGrid.HorizontalAlign = HorizontalAlign.NotSet;  
        currentGrid.GridLines = GridLines.None;  
        currentGrid.ShowHeader = false;  
        currentGrid.AllowPaging = false;  
 
        currentGrid.ColumnCreated += new GridColumnCreatedEventHandler(CatalogGrid_ColumnCreated);  
        currentGrid.ID = "CatalogGrid_" + CatalogID;  
        currentGrid.MasterTableView.DataKeyNames = new string[2] { "CatalogID""ParentClassificationID" };  
 
        currentGrid.Width = Unit.Percentage(100);  
        currentGrid.AutoGenerateColumns = false;  
        currentGrid.GroupingEnabled = false;  
        currentGrid.ShowGroupPanel = false;  
        currentGrid.AllowSorting = true;  
        currentGrid.MasterTableView.HierarchyDefaultExpanded = true;  
        currentGrid.MasterTableView.HierarchyLoadMode = GridChildLoadMode.ServerOnDemand;  
        currentGrid.MasterTableView.SelfHierarchySettings.KeyName = "CatalogID";  
        currentGrid.MasterTableView.SelfHierarchySettings.ParentKeyName = "ParentClassificationID";  
        currentGrid.MasterTableView.SelfHierarchySettings.MaximumDepth = 10;  
        currentGrid.MasterTableView.TableLayout = GridTableLayout.Fixed;  
 
        if (Assembly.GetAssembly(typeof(ScriptManager)).FullName.IndexOf("3.5") != -1)  
        {  
            currentGrid.MasterTableView.FilterExpression = @"it[""ParentClassificationID""] = " + CatalogID;  
        }  
        else 
        {  
            currentGrid.MasterTableView.FilterExpression = "ParentClassificationID = " + CatalogID;  
        }  
          
        currentGrid.ClientSettings.AllowExpandCollapse = true;  
 
        GridTemplateColumn templateColumn = new GridTemplateColumn();  
        templateColumn.UniqueName = "CatalogName";  
        templateColumn.ItemTemplate = new MyTemplate(templateColumn.UniqueName);  
        currentGrid.MasterTableView.Columns.Add(templateColumn);  
 
        currentGrid.ItemCreated += new GridItemEventHandler(CatalogGrid_ItemCreated);  
        currentGrid.ItemDataBound += new GridItemEventHandler(CatalogGrid_ItemDataBound);  
        currentGrid.NeedDataSource += new GridNeedDataSourceEventHandler(currentGrid_NeedDataSource);  
 
    }  
 
    private class MyTemplate : ITemplate  
    {  
        protected Button btExpandCollapse;  
        protected Image imClassification;  
        protected Label lbCatalogName;  
        protected HyperLink hyCurriculumName;  
        protected Literal ltShortDescription;  
        protected HtmlGenericControl divAround;  
 
        private string colname;  
        public MyTemplate(string cName)  
        {  
            colname = cName;  
        }  
        public void InstantiateIn(System.Web.UI.Control container)  
        {  
            btExpandCollapse = new Button();  
            btExpandCollapse.ID = "btExpandCollapse";  
            btExpandCollapse.CommandName = "ExpandCollapse";  
 
            imClassification = new Image();  
            imClassification.ID = "imClassification";  
            imClassification.Visible = false;  
 
            lbCatalogName = new Label();  
            lbCatalogName.ID = "lbCatalogName";  
 
            hyCurriculumName = new HyperLink();  
            hyCurriculumName.ID = "hyCurriculumName";  
 
            ltShortDescription = new Literal();  
            ltShortDescription.ID = "ltShortDescription";  
 
            divAround = new HtmlGenericControl();  
            divAround.ID = "divAround";  
 
            divAround.Controls.Add(btExpandCollapse);  
            divAround.Controls.Add(imClassification);  
            divAround.Controls.Add(lbCatalogName);  
            divAround.Controls.Add(hyCurriculumName);  
            divAround.Controls.Add(ltShortDescription);  
 
            container.Controls.Add(divAround);  
 
        }  
 
    }  
 
    void currentGrid_NeedDataSource(object source, GridNeedDataSourceEventArgs e)  
    {  
        GridControl grid = (GridControl)source;  
        int ClassificationID = Convert.ToInt32(grid.ID.Substring(grid.ID.IndexOf("_") + 1));  
 
        if (catalogDS == null)  
        {  
            GetDataset();  
            Session["CatalogGridSource"] = catalogDS;  
        }  
 
        grid.DataSource = GetCatalogRows(catalogDS, ClassificationID);  
    }  
 
    private DataSet GetCatalogRows(DataSet ds, int CatalogID)  
    {  
        DataSet dsNew = new DataSet();  
        dsNew.Tables.Add(ds.Tables[0].Clone());  
        dsNew.Tables[0].Clear();  
        DataRow[] rows = ds.Tables[0].Select("ParentClassificationID = " + CatalogID);  
        dsNew.Merge(rows);  
        foreach(DataRow row in rows)   
        {  
            dsNew.Merge(GetCatalogRows(ds, Convert.ToInt32(row["CatalogID"])));  
        }  
        return dsNew;  
    }  
 
    public void HideExpandColumnRecursive(GridTableView tableView)  
    {  
        GridItem[] nestedViewItems = tableView.GetItems(GridItemType.NestedView);  
        foreach (GridNestedViewItem nestedViewItem in nestedViewItems)  
        {  
            foreach (GridTableView nestedView in nestedViewItem.NestedTableViews)  
            {  
                nestedView.Style["border"] = "0";  
 
                Button MyExpandCollapseButton = (Button)nestedView.ParentItem.FindControl("btExpandCollapse");  
                if (nestedView.Items.Count == 0)  
                {  
                    if (MyExpandCollapseButton != null)  
                    {  
                        MyExpandCollapseButton.Style["visibility"] = "hidden";  
                    }  
                    GridDataItem dataItem = (GridDataItem)nestedView.ParentItem;  
                    TableCell cell = dataItem[dataItem.OwnerTableView.ExpandCollapseColumn.UniqueName];  
                    cell.Controls[0].Visible = false;  
 
                    nestedViewItem.Visible = false;  
                }  
                else 
                {  
                    if (MyExpandCollapseButton != null)  
                    {  
                        MyExpandCollapseButton.Style.Remove("visibility");  
                    }  
                }  
 
                if (nestedView.HasDetailTables)  
                {  
                    HideExpandColumnRecursive(nestedView);  
                }  
            }  
        }  
    }  
 
    protected void CatalogGrid_ItemCreated(object sender, GridItemEventArgs e)  
    {  
        if (e.Item is GridCommandItem)  
        {  
            e.Item.Style["display"] = "none";  
        }  
 
        if (e.Item is GridHeaderItem)  
        {  
            //Hides the headers  
            e.Item.Style["display"] = "none";  
        }  
 
        if (e.Item is GridNestedViewItem)  
        {  
            e.Item.Cells[0].Visible = false;  
            e.Item.Cells[0].Width = Unit.Pixel(150);  
        }  
 
        if (e.Item is GridNoRecordsItem)  
        {  
            e.Item.Style["display"] = "none";  
            e.Item.OwnerTableView.Visible = false;  
        }  
 
    }  
 
    protected void CatalogGrid_ItemDataBound(object sender, GridItemEventArgs e)  
    {  
        if (e.Item is GridDataItem)  
        {  
 
            string Path = Server.MapPath("~\\Portals\\" + ((PortalPage)this.Page).UsePortalID.ToString() + "\\img\\Catalog\\");  
 
            GridDataItem gridDataItem = e.Item as GridDataItem;  
            Image imClassification = gridDataItem["CatalogName"].FindControl("imClassification"as Image;  
            Label lbCatalogName = gridDataItem["CatalogName"].FindControl("lbCatalogName"as Label;  
            HyperLink hyCurriculumName = gridDataItem["CatalogName"].FindControl("hyCurriculumName"as HyperLink;  
            if (Convert.ToInt32(DataBinder.Eval(e.Item.DataItem, "IsCurriculum").ToString()) == 1)  
            {  
                hyCurriculumName.Text = DataBinder.Eval(e.Item.DataItem, "CatalogName").ToString() + " (" + DataBinder.Eval(e.Item.DataItem, "NumCourses").ToString() + ")";  
                hyCurriculumName.NavigateUrl = "~/modules/catalog/Package.aspx?CourseGroupID=" + DataBinder.Eval(e.Item.DataItem, "CatalogID").ToString();  
                lbCatalogName.Visible = false;  
            }  
            else 
            {  
                lbCatalogName.Text = DataBinder.Eval(e.Item.DataItem, "CatalogName").ToString();  
                hyCurriculumName.Visible = false;  
            }  
            if (DataBinder.Eval(e.Item.DataItem, "ImageName").ToString() != "")  
            {  
                imClassification.ImageUrl = Path + DataBinder.Eval(e.Item.DataItem, "ImageName").ToString();  
                imClassification.Visible = true;  
            }  
            Literal ltShortDescription = gridDataItem["CatalogName"].FindControl("ltShortDescription"as Literal;  
            if (DataBinder.Eval(e.Item.DataItem, "ShortDescription").ToString() != "")  
            {  
                ltShortDescription.Text = "<p>" + DataBinder.Eval(e.Item.DataItem, "ShortDescription").ToString() + "</p>";  
            }  
            else 
            {  
                ltShortDescription.Visible = false;  
            }  
 
            //Create Levels  
            Button btExpandCollapse = gridDataItem["CatalogName"].FindControl("btExpandCollapse"as Button;  
            btExpandCollapse.Click += new EventHandler(button_Click);  
            if (!IsPostBack)  
            {  
                btExpandCollapse.CssClass = (Convert.ToInt32(DataBinder.Eval(e.Item.DataItem, "ShowExpanded").ToString()) == 0) ? "rgCollapse" : "rgExpand";  
            }  
            else 
            {  
                btExpandCollapse.CssClass = (e.Item.Expanded) ? "rgCollapse" : "rgExpand";  
            }  
            btExpandCollapse.CssClass = (e.Item.Expanded) ? "rgCollapse" : "rgExpand";  
 
            HtmlGenericControl divAround = gridDataItem["CatalogName"].FindControl("divAround"as HtmlGenericControl;  
            int level = (e.Item.ItemIndexHierarchical.Split(':').Length > 0 ? e.Item.ItemIndexHierarchical.Split(':').Length - 1 : e.Item.ItemIndexHierarchical.Split(':').Length);  
            if (level > 0)  
            {  
                divAround.Style["margin-left"] = (level * 20) + "px";  
            }  
 
            //if (e.Item.OwnerTableView.HierarchyLoadMode == GridChildLoadMode.Client)  
            //{  
            //    string script = String.Format(@"$find(""{0}"")._toggleExpand(this, event); return false;", gridDataItem.Parent.Parent.ClientID);  
            //    btExpandCollapse.OnClientClick = script;  
            //}  
 
        }  
 
    }  
 
    private void LoadCatalog(DataSet ds)  
    {  
        DataSet Catalogds = new DataSet();  
        Catalogds.Tables.Add(ds.Tables[0].Clone());  
        Catalogds.Tables[0].Clear();  
 
        DataRow[] rows = null;  
        rows = ds.Tables[0].Select("ParentClassificationID IS NULL");  
 
        foreach (DataRow row in rows)  
        {  
            Catalogds.Tables[0].ImportRow(row);  
        }  
 
        int prevClassificationID = -1;  
        for (int counter = 0; counter < Catalogds.Tables[0].Rows.Count; counter++)  
        {  
            DataRow row = Catalogds.Tables[0].Rows[counter];  
 
            int ClassificationID = -1;  
            if (row["CatalogID"] != DBNull.Value)  
            {  
                ClassificationID = Convert.ToInt32(row["CatalogID"].ToString());  
            }  
 
            if (ClassificationID != prevClassificationID)  
            {  
                CatalogDiv = new HtmlGenericControl("div");  
                CatalogDiv.ID = "CatalogDiv" + row["CatalogID"].ToString();  
                CatalogDiv.Attributes.Add("class""root-catalog");  
 
                CatalogHeader = new HtmlGenericControl("h2");  
                CatalogHeader.ID = "CatalogHeader" + row["CatalogID"].ToString();  
                CatalogHeader.InnerText = row["CatalogName"].ToString();  
 
                CatalogDiv.Controls.Add(CatalogHeader);  
 
                prevClassificationID = ClassificationID;  
            }  
 
            CreateGrid(ClassificationID);  
 
            CatalogDiv.Controls.Add(currentGrid);  
            phCatalog.Controls.Add(CatalogDiv);  
 
        }  
    }  
 
    void button_Click(object sender, EventArgs e)  
    {  
        ((Button)sender).CssClass = (((Button)sender).CssClass == "rgExpand") ? "rgCollapse" : "rgExpand";  
    }  
 
 

I had this entire page working properly with a grid defined in the ASCX file.  But when I moved the code to the code-behind so it could be formatted as the client requested, then the expand stopped working. 

Thanks in advance for any help you can give!
Chris

2 Answers, 1 is accepted

Sort by
0
Chris Rickert
Top achievements
Rank 1
answered on 27 Apr 2009, 10:22 PM
I forgot to indicate that we are using Telerik RadGrid for ASP.NET version 2008.2.826.20.   We cannot upgrade to a newer version at this time because of Skin changes.

Thanks!
Chris
0
Georgi Krustev
Telerik team
answered on 01 May 2009, 08:16 AM
Hello Chris,

Unfortunately I could not reproduce this issue. I created a test project in my attempt to recreate the abnormality explained so far. I used the specified version of RadControls (2008.2.826.20). I've attached my sample web site project to this support thread. Please examine it and tell me if I am missing something.

Kind regards,
Georgi Krustev
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
Tags
Grid
Asked by
Chris Rickert
Top achievements
Rank 1
Answers by
Chris Rickert
Top achievements
Rank 1
Georgi Krustev
Telerik team
Share this question
or