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

UserControl with grid inside nodetemplate problem

1 Answer 51 Views
TreeView
This is a migrated thread and some comments may be shown as answers.
stefano
Top achievements
Rank 1
stefano asked on 10 May 2011, 12:03 PM
Hello

In this post : http://www.telerik.com/community/forums/aspnet-ajax/treeview/how-to-handle-node-templates-with-load-on-demand.aspx 
i've asked support about how to put togheter load on demand and treeview nodes templates, and the following post has given me hints on how to add gridviews into node templates at runtimes :
http://www.telerik.com/community/forums/aspnet-ajax/treeview/adding-the-radgrid-in-the-nodetemplate-dynamically.aspx
Now i've got a tree with the following structure :
year 1
    |_ first quarter 
            |_ department (uses load on demand , server side)
                |_code (uses load on demand , server side)
                    |_template Node : contains an asp.net userControl with a radgrid
    |_ second quarter ...
year 2 ...

All nodes are added programmatically, and the department and code subnodes load their children on demand. Now i need the template node to contains some richer controls to display more than a string , so i've chosen a radgrid.

The radgrid rows should contain also a link button to allow the user to edit the selected record (not inline but redirecting to an appropriate page ).
I've put the grid into a usercontrol and bound it to an objectdatasource, hoping it avoided me to define all the grid properties programmatically, but i can't achieve it , instead if i set the datasource programmaticaly to one of my businness object (which returns a datatable ) it gets instantiated, but i haven't sorting, paging etc.
the second problem happens when i open any of the load on demand nodes : if i had preaviuosly opened another load on demand node , its template node (the grid) gets resetted to an empty node.

Below i've added the code of the page that uses the custom control with grid and the custom control itsself :

1. load on demand expand method

protected void RTVIndagini_NodeExpand(object sender, RadTreeNodeEventArgs e)
{
    //if (e.Node.Nodes.Count != 0) return;
    switch (e.Node.Category)
    {
        case "trimestre":
            {
                decimal anno = int.Parse(e.Node.ParentNode.Value);
                decimal trimestre = int.Parse(e.Node.Value);
                IndagineModel im = new IndagineModel();
                IDictionary<decimal, String> enti = im.getEnti(anno, trimestre);
                foreach (decimal key in enti.Keys)
                {
                    RadTreeNode nodoEnte = new RadTreeNode(enti[key], key.ToString());
                    nodoEnte.Category = "ente";
                    nodoEnte.ExpandMode = TreeNodeExpandMode.ServerSide;
                    e.Node.Nodes.Add(nodoEnte);
                }
                break;
            }
        case "ente":
            {
                Decimal ente = Decimal.Parse(e.Node.Value);
                RadTreeNode trimestre = e.Node.ParentNode;
                Decimal trimestreValue = Decimal.Parse(trimestre.Value);
                Decimal anno = Decimal.Parse(trimestre.ParentNode.Value);
                IndagineModel im = new IndagineModel();
                IDictionary<String,String> codiciReclamo = im.getCodiciReclamo(anno, trimestreValue, ente);
                foreach (String key in codiciReclamo.Keys )
                {
                    RadTreeNode nodoCodiceReclamo = new RadTreeNode(
                        String.Format("{0} - {1}", key, codiciReclamo[key]), key);
                    nodoCodiceReclamo.Category = "codicereclamo";
                    nodoCodiceReclamo.ExpandMode = TreeNodeExpandMode.ServerSide;
                    e.Node.Nodes.Add(nodoCodiceReclamo);
                }
                break;
            }
        case "codicereclamo":
            {
                DatiPratiche dto = new DatiPratiche();
                dto.reclamo = e.Node.Value;
                RadTreeNode ente = e.Node.ParentNode;
                dto.ente = decimal.Parse(e.Node.ParentNode.Value);
                RadTreeNode trimestre = ente.ParentNode;
                dto.trimestre = decimal.Parse(trimestre.Value);
                dto.anno = decimal.Parse(trimestre.ParentNode.Value);
                //TestNodeTempateOnDemand tst = new TestNodeTempateOnDemand();
                customControls_Indagine_NodeTemplate tst = new customControls_Indagine_NodeTemplate();
                RadTreeNode temp = new RadTreeNode();
                tst.InstantiateIn(temp);
                e.Node.Nodes.Add(temp);
                RTVIndagini.DataBind();
            }
            break;
    }
    //e.Node.Expanded = true;
    e.Node.ExpandMode = TreeNodeExpandMode.ClientSide;
    //RTVIndagini.DataBind();
}

2. custom control node template html

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="NodeTemplate.ascx.cs" Inherits="customControls_Indagine_NodeTemplate" %>
<telerik:RadGrid ID="RadGrid1" runat="server" DataSourceID="ObjectDataSource1" 
    GridLines="None" Skin="Web20" onitemdatabound="RadGrid1_ItemDataBound" 
    AllowPaging="True" AllowSorting="True">
<MasterTableView DataSourceID="ObjectDataSource1" AutoGenerateColumns="False" 
        DataKeyNames="C_COD_REC">
<RowIndicatorColumn>
<HeaderStyle Width="20px"></HeaderStyle>
</RowIndicatorColumn>
  
<ExpandCollapseColumn>
<HeaderStyle Width="20px"></HeaderStyle>
</ExpandCollapseColumn>
    <Columns>
        <telerik:GridBoundColumn DataField="C_COD_REC" HeaderText="C_COD_REC" 
            ReadOnly="True" SortExpression="C_COD_REC" UniqueName="C_COD_REC">
        </telerik:GridBoundColumn>
        <telerik:GridBoundColumn DataField="C_MAC_ARE" HeaderText="C_MAC_ARE" 
            SortExpression="C_MAC_ARE" UniqueName="C_MAC_ARE">
        </telerik:GridBoundColumn>
        <telerik:GridBoundColumn DataField="C_ARE" HeaderText="C_ARE" 
            SortExpression="C_ARE" UniqueName="C_ARE">
        </telerik:GridBoundColumn>
        <telerik:GridBoundColumn DataField="C_DET" HeaderText="C_DET" 
            SortExpression="C_DET" UniqueName="C_DET">
        </telerik:GridBoundColumn>
        <telerik:GridBoundColumn DataField="T_RIF_TAB" DataType="System.Decimal" 
            HeaderText="T_RIF_TAB" SortExpression="T_RIF_TAB" UniqueName="T_RIF_TAB">
        </telerik:GridBoundColumn>
        <telerik:GridBoundColumn DataField="C_MOD" HeaderText="C_MOD" 
            SortExpression="C_MOD" UniqueName="C_MOD">
        </telerik:GridBoundColumn>
    </Columns>
</MasterTableView>
</telerik:RadGrid>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    DeleteMethod="delete" InsertMethod="insert" 
    OldValuesParameterFormatString="original_{0}" SelectMethod="getDatiCodice" 
    TypeName="CodiceReclamo" UpdateMethod="update">
    <DeleteParameters>
        <asp:Parameter Name="Original_C_COD_REC" Type="String" />
        <asp:Parameter Name="Original_C_MAC_ARE" Type="String" />
        <asp:Parameter Name="Original_C_ARE" Type="String" />
        <asp:Parameter Name="Original_C_DET" Type="String" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="T_RIF_TAB" Type="Decimal" />
        <asp:Parameter Name="Original_C_COD_REC" Type="String" />
        <asp:Parameter Name="Original_C_MAC_ARE" Type="String" />
        <asp:Parameter Name="Original_C_ARE" Type="String" />
        <asp:Parameter Name="C_MOD" Type="String" />
        <asp:Parameter Name="Original_C_DET" Type="String" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter Name="C_COD_REC" Type="String" />
        <asp:Parameter Name="C_MAC_ARE" Type="String" />
        <asp:Parameter Name="C_ARE" Type="String" />
        <asp:Parameter Name="C_DET" Type="String" />
        <asp:Parameter Name="T_RIF_TAB" Type="Decimal" />
        <asp:Parameter Name="C_MOD" Type="String" />
    </InsertParameters>
</asp:ObjectDataSource>


3. custom control template node code behind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
  
public partial class customControls_Indagine_NodeTemplate : System.Web.UI.UserControl,ITemplate
{
    protected void Page_Load(object sender, EventArgs e)
    {
  
    }
  
  
      
  
  
    #region ITemplate Members
  
    public void InstantiateIn(Control container)
    {
        RadGrid RadGrid1 = new RadGrid();
        RadGrid1.DataBinding += new EventHandler(RadGrid_DataBinding);
        container.Controls.Add(RadGrid1);  
    }
  
    void RadGrid_DataBinding(object sender, EventArgs e)
    {
 // I must add the following line of code to see the grid displayed 
//inside the tree node, but i don't have any paging, sorting ...
        //RadGrid target = (RadGrid)sender;
        //RadTreeNode node = (RadTreeNode)target.BindingContainer;
        //EnteModello em = new EnteModello();
        //target.DataSource = em.getModelliPerEnte();
    }
  
    #endregion
    protected void RadGrid1_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
    {
  
    }
}


thank you in advance for your support
 
 

1 Answer, 1 is accepted

Sort by
0
Dimitar Terziev
Telerik team
answered on 18 May 2011, 08:30 AM
Hello Stefano,

When you are adding controls dynamically like the case with the RadGrid for instance, you should add them upon each post-back since they are lost otherwise.

So the problem you are experiencing might be related to the fact that once you open another node which is causing a post-back you are not adding the RadGrid again and thus it's lost.

Make sure that the RadGrid is added to the page upon each post-back.

Greetings,
Dimitar Terziev
the Telerik team

Browse the vast support resources we have to jump start your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.

Tags
TreeView
Asked by
stefano
Top achievements
Rank 1
Answers by
Dimitar Terziev
Telerik team
Share this question
or