radgridview hierarchy refreshing hierarchy grid closes

6 posts, 0 answers
  1. Nagaraju
    Nagaraju avatar
    5 posts
    Member since:
    Jan 2012

    Posted 20 Jan 2012 Link to this post

    Hi,
    I have a radgridview setup wth a hierarchy. I would like this grid to refresh every ten seconds as new information could be added to the database from another source, so it needs to be kept up-to-date. I did have a timer which would fire every ten seconds which reloaded the data.

    The only problem is, if I have a row expanded or select a row and the grid reloads the selected row is lost and the sub grids close. Is there any way I can  keep this open while the data refreshes? ie the new row would be added at the bottom?

    I have followed the http://www.telerik.com/community/forums/winforms/gridview/radgridview-hierarchy-refreshing-hierarchy-grid-closes.aspx  example given when i debug the code  i can see it is storing the expanded rows but while Restoring 

    if

     

     

    (expanded.Contains(item.DataBoundItem))

     

    {

    item.IsExpanded =

     

    true;

     

    }


    the condition is not satisfyting. Can U suggest Me How to do the above Task

    Thanks 
  2. Julian Benkov
    Admin
    Julian Benkov avatar
    1135 posts

    Posted 25 Jan 2012 Link to this post

    Hi Nagarajiu,

    In this scenario you should use the key column of you parent table. When saving/restoring data you can use the 'ID' column. Consider the following sample:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Windows.Forms;
    using Telerik.WinControls.UI;
     
    namespace Lab.GridView
    {
        public partial class SaveRestoreHierarchyGrid : Form
        {
            private RadGridView gridView = new RadGridView();
            private DataTable parentTable = new DataTable();
            private DataTable childTable = new DataTable();
            private Random random = new Random((int)DateTime.Now.Ticks);
            private HashSet<object> expanded = new HashSet<object>();
     
            public SaveRestoreHierarchyGrid()
            {
                InitializeComponent();
     
                gridView.Dock = DockStyle.Fill;
                this.Controls.Add(gridView);
                this.button1.BringToFront();
            }
     
            private void HierarchyGridForm_Load(object sender, EventArgs e)
            {
                LoadData();
                CreateRelationHierarchy();
            }
     
            private void CreateRelationHierarchy()
            {
                GridViewTemplate template = new GridViewTemplate();
                template.DataSource = childTable;
                gridView.Templates.Add(template);
     
                GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem();
                GridViewSummaryItem summaryItem = new GridViewSummaryItem("ChildValue3", "", GridAggregateFunction.Sum);
                summaryItem.FormatString = "{0:N3}";
     
                summaryRowItem.Add(summaryItem);
                template.SummaryRowsBottom.Add(summaryRowItem);
     
                GridViewRelation relation = new GridViewRelation(gridView.MasterTemplate, template);
                relation.ChildColumnNames.Add("ParentID");
                relation.ParentColumnNames.Add("ID");
                gridView.Relations.Add(relation);
            }
     
            private void LoadData()
            {
                parentTable.Columns.Add("ID", typeof(int));
                parentTable.Columns.Add("ParentValue1", typeof(int));
                parentTable.Columns.Add("ParentValue2");
                parentTable.Columns.Add("ParentValue3", typeof(double));
                parentTable.Rows.Add(1, 100, "Value100", 100.1);
                parentTable.Rows.Add(2, 200, "Value200", 200.2);
                parentTable.Rows.Add(3, 300, "Value300", 300.3);
                parentTable.Rows.Add(4, 400, "Value400", 400.4);
                parentTable.Rows.Add(5, 500, "Value500", 500.3);
                gridView.DataSource = parentTable;
     
                childTable.Columns.Add("ID", typeof(int));
                childTable.Columns.Add("ParentID", typeof(int));
                childTable.Columns.Add("ChildValue1", typeof(int));
                childTable.Columns.Add("ChildValue2");
                childTable.Columns.Add("ChildValue3", typeof(double));
                childTable.Rows.Add(1, 1, 10, "Child100", 10.1);
                childTable.Rows.Add(2, 1, 20, "Child200", 20.2);
                childTable.Rows.Add(3, 2, 30, "Child300", 30.3);
                childTable.Rows.Add(4, 2, 40, "Child400", 40.4);
                childTable.Rows.Add(5, 2, 50, "Child500", 50.3);
                childTable.Rows.Add(6, 4, 60, "Child600", 60.3);
                childTable.Rows.Add(7, 5, 70, "Child700", 70.3);
                childTable.Rows.Add(8, 5, 80, "Child800", 80.3);
                childTable.Rows.Add(9, 5, 90, "Child900", 90.3);
                childTable.Rows.Add(10, 5, 100, "Child1000", 100.3);
     
                DataSet set = new DataSet();
                set.Tables.Add(parentTable);
                set.Tables.Add(childTable);
     
                set.Relations.Add("MyRelation", parentTable.Columns[0], childTable.Columns[1]);
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                this.expanded = SaveExpanded(this.gridView);
     
                gridView.DataSource = null;
                gridView.DataSource = parentTable;
     
                RestoreExpanded(this.expanded, this.gridView);
            }
     
            private void RestoreExpanded(HashSet<object> expanded, RadGridView rg)
            {
                foreach (var item in rg.Rows)
                {
                    if (expanded.Contains(((DataRowView)item.DataBoundItem)[0]))
                    {
                        item.IsExpanded = true;
                    }
                }
            }
     
            private HashSet<object> SaveExpanded(RadGridView rg)
            {
                HashSet<object> items = new HashSet<object>();
                foreach (var item in rg.Rows)
                {
                    if (item.IsExpanded)
                    {
                        items.Add(((DataRowView)item.DataBoundItem)[0]);
                    }
                }
     
                return items;
            }
        }
    }

    I hope this helps.

    Greetings,
    Julian Benkov
    the Telerik team

    SP1 of Q3’11 of RadControls for WinForms is available for download (see what's new).

  3. Nagaraju
    Nagaraju avatar
    5 posts
    Member since:
    Jan 2012

    Posted 27 Jan 2012 Link to this post

    Hi Julian,

    Thank You so much it is working fine now i am able to restore the expanded ones.

    Regards,
    Nagaraju.
  4. Julian Benkov
    Admin
    Julian Benkov avatar
    1135 posts

    Posted 31 Jan 2012 Link to this post

    Hello Nagaraju,

    I am glad to hear that my answer was helpful. Do not hesitate to contact us if you have other questions.

    Kind regards,
    Julian Benkov
    the Telerik team

    SP1 of Q3’11 of RadControls for WinForms is available for download (see what's new).

  5. Nagaraju
    Nagaraju avatar
    5 posts
    Member since:
    Jan 2012

    Posted 15 Feb 2012 Link to this post

    HI Julian,
    I need to restore the selected row also so i have wriiten the same thing

     

     

     

    public HashSet<object> SaveSelectedRow(RadGridView rg, string primaryKey)

     

    {

     

     

    HashSet<object> items = new HashSet<object>();

     

     

     

    foreach (var item in rg.Rows)

     

    {

     

     

    if (item.IsSelected)

     

    {

    items.Add(((

     

    DataRowView)item.DataBoundItem)[primaryKey]);

     

    }

    }

     

     

    return items;

     

    }

     

     

     

     

    public void RestoreSelectedRow(HashSet<object> expanded, RadGridView rg, string primaryKey)

     

    {

     

     

    foreach (var item in rg.Rows)

     

    {

     

     

    if (expanded.Contains(((DataRowView)item.DataBoundItem)[primaryKey]))

     

    {

    item.IsSelected =

     

    true;

     

    }

    }

    }

    I am able to get the slected row state and making it as selected but the problem i am facing is getting error message "X" column not found some times. If i have 3 columns the error is displaying 3times.
    I have called the code as below

     

    slectGrid.ClearSelection();

    slectGrid.RestoreSelectedRow(

     

    this._gridSelectedRow, this.slectGrid, "primaryKey");

    Could u help me in this.

     

  6. Julian Benkov
    Admin
    Julian Benkov avatar
    1135 posts

    Posted 17 Feb 2012 Link to this post

    Hi Nagaraju,

    Please check the colums schema of your bound DataTable object. In order to have a property working implementation, the used primaryKey string must exist for the previous and current DataTable Columns Name property after the rebinding operation.

    If you continue to experience the issue, please send me a simple project to investigate it locally and find the best solution for the case.

    Please note that you have to open a new support ticket in order to be able to attach your project.

    All the best,
    Julian Benkov
    the Telerik team
    Sharpen your .NET Ninja skills! Attend Q1 webinar week and get a chance to win a license! Book your seat now >>
Back to Top