Losing Grid column metadata when batch editing rad grid that is statically declared with dynamically defined columns

3 posts, 0 answers
  1. Jonathan
    Jonathan avatar
    9 posts
    Member since:
    Aug 2015

    Posted 09 Feb Link to this post

    Hi 

    I'm having problems with the grid losing the dynamic column metadata when using the batch edit "save changes" and cancel changes" buttons.  See the attached pictures. The grid is declared in the ASPX page and the columns are assigned in the page_load event only on the first page load.

    Here is the grid declaration:

    <telerik:RadGrid
        ID="radGridGrades"
        runat="server"
        AllowPaging="false"
        Width="100%"
        enableEmbeddedSkins="false"
        Skin="CorpsNETBootstrap"
        AllowSorting="true"
        ClientSettings-Selecting-AllowRowSelect="true"
        AllowMultiRowSelection="true"
        ClientSettings-AllowKeyboardNavigation="true"
        ItemStyle-HorizontalAlign="Center"
        HeaderStyle-HorizontalAlign="Center"
        AlternatingItemStyle-HorizontalAlign="Center"
        AllowMultiRowEdit="true"
        OnBatchEditCommand="radGridGrades_BatchEditCommand"                                            
        OnNeedDataSource="radGridGrades_NeedDataSource"
        OnItemDataBound="radGridGrades_ItemDataBound">                                           
        <MasterTableView
            AutoGenerateColumns="False"
            DataKeyNames="ID"
            Width="100%"
            CommandItemDisplay="Top"
            CommandItemStyle-Height="15px"
            CommandItemSettings-ShowCancelChangesButton="true"
            CommandItemSettings-ShowAddNewRecordButton="false"                                               
            PageSize="10"
            EnableNoRecordsTemplate="true"
            EditMode="Batch"
            InsertItemPageIndexAction="ShowItemOnCurrentPage">                                               
            <Columns>
            </Columns>
            <EditFormSettings>
                <PopUpSettings ScrollBars="None" />
            </EditFormSettings>
            <NoRecordsTemplate>
                <div align="center" style="color:darkorange">---------- No Records to Display -----------</div>
            </NoRecordsTemplate>
        </MasterTableView>
        <ClientSettings>
        </ClientSettings>
    </telerik:RadGrid>                       

     

    And here is the code-behind for the page:

    public partial class GradesByClass : CorpsNET.BasePage
    {
        CorpsNETServer.ScheduledClass _scheduledClass;
        CorpsNETServer.Lookup _academicSchedule;
        CorpsNETServer.AcademicAssignment _academicAssignment;   
     
        protected void Page_Load(object sender, EventArgs e)
        {
            base.Page_Load(sender, e);
     
            if (Request.QueryString["ScheduledClassID"] != null)
            {
                _scheduledClass = ScheduledClassService.GetByID(Int32.Parse(Request.QueryString["ScheduledClassID"]));
            }
     
            if (!Page.IsPostBack)
            {
                if (((UserProfile)Session["_userProfile"]).IsAuthorized("Grades - Edit") == true)
                {
                    Master.SetLocation("GradesByClass.aspx", "Grade Entry for:  <b>" + _scheduledClass.SubjectName + "</b>", true);
                }
                else
                {
                    throw new CorpsNETServer.CorpsNETAuthException("Grades - Edit");
                }
                
                //rdpRosterDate.SelectedDate = DateTime.Now;
                lblClassPeriod.Text = _scheduledClass.ClassPeriodName;
                lblClassroom.Text = _scheduledClass.ClassroomName;
                lblClassSchedule.Text = _scheduledClass.ClassroomScheduleName;
                lblSubject.Text = _scheduledClass.SubjectName;
                lblTeacher.Text = _scheduledClass.TeacherName;
                lblTrimester.Text = _scheduledClass.TrimesterName;
     
                LoadGridStructure();
            }
        }
     
        public void LoadGridStructure()
        {
            radGridGrades.Columns.Add(new GridBoundColumn() { ReadOnly=true,  UniqueName = "Corpsmember", DataField = "EmployeeName", HeaderText = "Corpsmember", SortExpression = "EmployeeName" });
            radGridGrades.Columns.Add(new GridBoundColumn() { ReadOnly = true, UniqueName = "AcademicScheduleName", DataField = "AcademicScheduleName", HeaderText = "Academic Schedule", SortExpression = "AcademicScheduleName" });
            radGridGrades.Columns.Add(new GridBoundColumn() { ReadOnly = true, UniqueName = "CurrentStatusName", DataField = "CurrentStatusName", HeaderText = "Current Status", SortExpression = "CurrentStatusName" });
     
            List<AcademicAssignment> _academicAssignemnts = AcademicAssignmentService.GetForScheduledClass(_scheduledClass.ID);
     
            for (int i = 0; i < _academicAssignemnts.Count; i++)
            {
                radGridGrades.Columns.Add(new GridBoundColumn() { UniqueName = _academicAssignemnts[i].ID.ToString(), HeaderText = "Assignment: <a href='#' class='RadGrid_CorpsNETBootstrap_a' onclick =openEditAcademicAssignmentWindow(" + _academicAssignemnts[i].ID + "); return false;>" + _academicAssignemnts[i].Name + "</a> Due Date: <b>" + _academicAssignemnts[i].DueDateString + "</b>" });
            }
        }
     
        public void LoadStudents()
        {
            radGridGrades.DataSource = EmployeeService.GetForScheduledClass(_scheduledClass.ID);
        }
     
        protected void radGridGrades_ItemDataBound(object sender, GridItemEventArgs e)
        {
            if (e.Item is GridDataItem)
            {
                GridEditableItem form = (GridEditableItem)e.Item;
     
                int employeeid = Int32.Parse(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["ID"].ToString());
     
                //goto through all the assignments and load any existing grades for that assignment
                List<AcademicAssignment> _academicAssignments = AcademicAssignmentService.GetForScheduledClass(_scheduledClass.ID);
     
                for (int i = 0; i < _academicAssignments.Count; i++)
                {
                    //radGridGrades.Columns.Add(new GridBoundColumn() { UniqueName = _academicAssignemnts[i].ID.ToString(), HeaderText = "Assignment: <b>" + _academicAssignemnts[i].Name + "</b> Due Date: <b>" + _academicAssignemnts[i].DueDateString + "</b>" });
                    //get the grade for this assignment and Employee
                    Grade _grade = GradeService.GetForAcademicAssignment(employeeid, _academicAssignments[i].ID);
     
                    if (_grade != null)
                    {
                        if (_academicAssignments[i].LetterGrade == true)
                            form[_academicAssignments[i].ID.ToString()].Text = _grade.LetterGrade;
                        else
                            form[_academicAssignments[i].ID.ToString()].Text = _grade.Points.ToString();
                    }
                    else
                        form[_academicAssignments[i].ID.ToString()].Text = string.Empty;
                }
            }       
        }
     
        protected void radGridGrades_NeedDataSource(object source, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
        {
            LoadStudents();
        }
     
        protected void radGridGrades_BatchEditCommand(object sender, GridBatchEditingEventArgs e)
        {
            //todo
        }
     
    }

     

    On the first page load everything works fine.  (see pic 1)  I want to edit only the values in a single column.  I'm aware that I have not yet implemented the save code.  the problem is that the first columns lose their definitions after postback by either the 'cancel changes' or 'save changes' batch edit buttons.  CAn you point me in the right direction?  Thanks.

  2. Peter Milchev
    Admin
    Peter Milchev avatar
    234 posts

    Posted 13 Feb Link to this post

    Hello Jonathan,

    I am sharing the solution from the support thread with the community, so that it could help people with similar issue.

    The problem is that when the columns are programmatically added, they should be added to the column collection first and then to assign the column properties as described in this article: Adding Columns Programmatically.

    Attached is a sample project based on the provided code snippets.

    Regards,
    Peter Milchev
    Telerik by Progress
    Try our brand new, jQuery-free Angular 2 components built from ground-up which deliver the business app essential building blocks - a grid component, data visualization (charts) and form elements.
  3. Jonathan
    Jonathan avatar
    9 posts
    Member since:
    Aug 2015

    Posted 13 Feb in reply to Peter Milchev Link to this post

    Thanks Peter
Back to Top