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

[Solved] Hierarchal Grid Sum Aggregate "neither a DataColumn nor a DataRelation" Problem

2 Answers 139 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Arroyocode
Top achievements
Rank 1
Arroyocode asked on 17 Sep 2009, 04:39 PM
Hello all, i'm having an issue attempting to Sum a nested grid column using Aggregate="Sum" with hiearchy ONLY when a user deletes a row from the nested grid (any Rebind() commands result in error listed below). If I remove the Aggregate="Sum" parameter from the nested grid, all ajax functionality works perfectly (rows removed upon delete, database values update from edit, etc.). But if the Aggregate parameter is used, I keep getting the following error:

[ColumnName] is neither a DataColumn nor a DataRelation for table.

The grid also utilizes RadAjax with an AjaxSetting to update itself. I'm experienced with the RadGrid, having deployed it various times before, but this one is stumping me and holding up the release of the project. Any help would be greatly appreciated.

Here's the code used:

<UX:RadGrid ID="uxExpenseGrid" ShowStatusBar="true" AutoGenerateColumns="false" AllowSorting="false" GridLines="None" OnItemCommand="GridItemCommand" OnNeedDataSource="InitEmployeeExpenses" OnDetailTableDataBind="EmployeeExpensesDataBind" EnableEmbeddedSkins="false" Skin="BMT" OnPreRender="InitPreRender" runat="server">  
                <MasterTableView Name="rootExpenses" HierarchyLoadMode="ServerBind" NoMasterRecordsText="&nbsp;&nbsp;No employee expenses recorded.">  
                    <DetailTables> 
                        <UX:GridTableView HeaderStyle-CssClass="gridSubHeader" ShowFooter="true" Width="100%" Name="rootExpensesSummary" GridLines="None">  
                            <Columns> 
                                <UX:GridBoundColumn DataField="ExpenseId" ReadOnly="true" UniqueName="ExpenseId" Display="false" /> 
                                <UX:GridBoundColumn DataField="EmployeeId" ReadOnly="true" UniqueName="EmployeeId" Display="false" /> 
                                <UX:GridBoundColumn DataField="ExpenseJob" ReadOnly="true" UniqueName="ExpenseJob" Display="false" /> 
                                <UX:GridBoundColumn DataField="JobDescription" ReadOnly="true" UniqueName="JobDescription" Display="false" /> 
                                <UX:GridBoundColumn DataField="EntryType" ReadOnly="true" UniqueName="EntryType" Display="false" /> 
                                <UX:GridBoundColumn DataField="EntryDate" ReadOnly="true" UniqueName="EntryDate" Display="false" /> 
                                <UX:GridBoundColumn DataField="ExpenseDate" ReadOnly="true" HeaderText="Date" UniqueName="ExpenseDate" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="11%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" /> 
                                <UX:GridBoundColumn DataField="JobId" ReadOnly="true" HeaderText="Job Id" UniqueName="JobId" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="8%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" /> 
                                <UX:GridBoundColumn DataField="TaskNumber" ReadOnly="true" HeaderText="Task #" UniqueName="TaskNumber" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="7%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" /> 
                                <UX:GridBoundColumn DataField="TaskName" ReadOnly="true" HeaderText="Task Name" UniqueName="TaskName" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="17%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" /> 
                                <UX:GridBoundColumn DataField="OverheadType" ReadOnly="true" HeaderText="Overhead Account" UniqueName="OverheadType" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="17%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" /> 
                                <UX:GridBoundColumn DataField="CostCode" ReadOnly="true" HeaderText="Cost Code" UniqueName="CostCode" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="9%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" FooterText="Sub Total: " /> 
                                <UX:GridBoundColumn DataField="Amount" HeaderText="Amount" UniqueName="Amount" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="8%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" FooterStyle-Height="30" FooterStyle-Font-Bold="true" DataFormatString="{0:C}" FooterAggregateFormatString="{0:C}" Aggregate="Sum" /> 
                                <UX:GridBoundColumn DataField="ExchangeRate" ReadOnly="true" HeaderText="Rate" UniqueName="ExchangeRate" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="5%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" /> 
                                <UX:GridBoundColumn DataField="Description" ReadOnly="true" HeaderText="Description" UniqueName="Description" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="11%" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" /> 
                                <UX:GridTemplateColumn  UniqueName="editTemplate" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="1%" ItemStyle-HorizontalAlign="Center" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0">  
                                    <ItemTemplate> 
                                        <asp:ImageButton ID="btnEdit" CommandName="Edit" AlternateText="Edit" runat="server" /> 
                                    </ItemTemplate> 
                                </UX:GridTemplateColumn> 
                                <UX:GridTemplateColumn UniqueName="deleteTemplate" HeaderStyle-CssClass="hoursHeader" ItemStyle-Width="1%" ItemStyle-HorizontalAlign="Center" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0">  
                                    <ItemTemplate> 
                                        <asp:ImageButton ID="btnDelete" CommandName="Delete" AlternateText="Delete" runat="server" /> 
                                    </ItemTemplate> 
                                </UX:GridTemplateColumn> 
                            </Columns> 
                            <EditFormSettings UserControlName="~/Expense/EditDirectExpense.ascx" EditFormType="WebUserControl">  
                                <EditColumn UniqueName="EditViaUserControl" /> 
                            </EditFormSettings> 
                        </UX:GridTableView> 
                    </DetailTables> 
                    <Columns> 
                        <UX:GridBoundColumn DataField="EmployeeId" ReadOnly="true" UniqueName="EmployeeId" Display="false" /> 
                        <UX:GridBoundColumn DataField="ExpenseJob" ReadOnly="true" UniqueName="ExpenseJob" Display="false" /> 
                        <UX:GridBoundColumn DataField="JobDescription" HeaderText="Expense Job/Account" UniqueName="JobDescription" ItemStyle-Width="50%" ItemStyle-BackColor="#dae2e8" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" ItemStyle-CssClass="hoursExpanded" /> 
                        <UX:GridBoundColumn DataField="EntryType" HeaderText="Expense Type" UniqueName="EntryType" ItemStyle-Width="50%" ItemStyle-BackColor="#dae2e8" ItemStyle-BorderStyle="None" ItemStyle-BorderWidth="0" ItemStyle-CssClass="hoursExpanded" /> 
                    </Columns> 
                </MasterTableView> 
            </UX:RadGrid> 

protected void InitEmployeeExpenses(object source, GridNeedDataSourceEventArgs e)  
            {  
                if (Session != null)  
                {  
                    var employeeId = 0;  
                    employeeId = Convert.ToInt32(Session["IntraDotNet_EmployeeId"].ToString());  
                    var updatedExpenseTable = LoadEmployeeExpensesByDateRange(employeeId, uxCustomDatePicker1.SelectedDate.Value.ToString(), uxCustomDatePicker2.SelectedDate.Value.ToString());  
                    uxExpenseGrid.DataSource = null;  
                    uxExpenseGrid.DataSource = updatedExpenseTable;  
                    uxExpenseGrid.MasterTableView.DataKeyNames = new string[] {"ExpenseJob"};  
                }  
            } 

protected void GridItemCommand(object source, GridCommandEventArgs e)  
            {  
                if (e.CommandName == RadGrid.DeleteCommandName)  
                {  
                    var deletedItem = e.Item as GridEditableItem;  
                    if (deletedItem != null)  
                    {  
                        var expenseId = Convert.ToInt32(deletedItem["ExpenseId"].Text);  
                        DeleteExpense(expenseId);  
                        uxExpenseGrid.MasterTableView.ClearEditItems();  
                        uxExpenseGrid.MasterTableView.Rebind();  
                    }  
                }  
                else if (e.CommandName == RadGrid.EditCommandName)  
                {  
                    var editedItem = e.Item as GridEditableItem;  
                    if (editedItem != null)  
                    {  
                        // Load direct labor hour edit usercontrol  
                        if (editedItem["EntryType"].Text.ToUpper() == "DIRECT")  
                        {  
                            uxExpenseGrid.MasterTableView.ClearEditItems();  
                            e.Item.OwnerTableView.EditFormSettings.UserControlName = "~/Expense/EditDirectExpense.ascx";  
                        }  
 
                        // Load overhead labor hour edit usercontrol  
                        else if (editedItem["EntryType"].Text.ToUpper() == "OVERHEAD")  
                        {  
                            uxExpenseGrid.MasterTableView.ClearEditItems();  
                            e.Item.OwnerTableView.EditFormSettings.UserControlName = "~/Expense/EditOverheadExpense.ascx";  
                        }  
                    }  
                }  
                else if (e.CommandName == RadGrid.UpdateCommandName)  
                {  
                    var updatedItem = e.Item as GridEditableItem;  
                    if (updatedItem != null)  
                    {  
                        // DIRECT EXPENSE UPDATE ---------------------------------------------------------------  
                        if (updatedItem["EntryType"].Text.ToUpper() == "DIRECT")  
                        {  
                            var employeeId = Convert.ToInt32(updatedItem["EmployeeId"].Text);  
                            var expenseJob = updatedItem["ExpenseJob"].Text;  
                            var startDate = uxCustomDatePicker1.SelectedDate.Value.ToString();  
                            var endDate = uxCustomDatePicker2.SelectedDate.Value.ToString();  
 
                            var timeEntryTable = LoadEmployeeExpensesByType(employeeId, expenseJob, startDate, endDate);  
                            var userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);  
 
                            // Init datarow  
                            DataRow[] changedRows = timeEntryTable.Select("ExpenseId = " + updatedItem["ExpenseId"].Text);  
 
                            // No matching record to update; Cancel update request  
                            if (changedRows.Length != 1)  
                            {  
                                e.Canceled = true;  
                                return;  
                            }  
 
                            // Gather nested UserControl form objects  
                            var editId = Convert.ToInt32(updatedItem["ExpenseId"].Text);  
                            var editDate = ((RadDatePicker)userControl.FindControl("uxDirectDate")).DateInput.SelectedDate.ToString();  
                            var editJobId = ((RadComboBox)userControl.FindControl("uxDirectJobIds")).SelectedItem.Value;  
                            var editJobTaskNumber = Convert.ToInt32(((RadComboBox)userControl.FindControl("uxDirectJobTasks")).SelectedItem.Value);  
                            var editCostCode = ((RadComboBox)userControl.FindControl("uxDirectCostCodes")).SelectedItem.Value;  
                            var editAmount = Convert.ToDecimal(((RadNumericTextBox)userControl.FindControl("uxDirectAmount")).Text);  
                            var editExchangeRate = Convert.ToDecimal(((RadNumericTextBox)userControl.FindControl("uxDirectExchangeRate")).Text);  
                            var editDescription = ((RadTextBox)userControl.FindControl("uxDirectDescription")).Text;  
                            var editUser = Session["IntraDotNet_DomainAccount"].ToString();  
 
                            UpdateDirectExpense(editId, editDate, editJobId, editJobTaskNumber, editCostCode, editAmount, editExchangeRate, editDescription, editUser);  
 
                            if (Session != null && Session["editFormEntryId"] != null)  
                                Session.Contents.Remove("editFormEntryId");  
                        }  
 
                        // OVERHEAD EXPENSE UPDATE -------------------------------------------------------------  
                        else if (updatedItem["EntryType"].Text.ToUpper() == "OVERHEAD")  
                        {  
                            var employeeId = Convert.ToInt32(updatedItem["EmployeeId"].Text);  
                            var expenseJob = updatedItem["ExpenseJob"].Text;  
                            var startDate = uxCustomDatePicker1.SelectedDate.Value.ToString();  
                            var endDate = uxCustomDatePicker2.SelectedDate.Value.ToString();  
 
                            var timeEntryTable = LoadEmployeeExpensesByType(employeeId, expenseJob, startDate, endDate);  
                            var userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);  
 
                            // Init datarow  
                            DataRow[] changedRows = timeEntryTable.Select("ExpenseId = " + updatedItem["ExpenseId"].Text);  
 
                            // No matching record to update; Cancel update request  
                            if (changedRows.Length != 1)  
                            {  
                                e.Canceled = true;  
                                return;  
                            }  
 
                            // Gather nested UserControl form objects  
                            var editId = Convert.ToInt32(updatedItem["ExpenseId"].Text);  
                            var editDate = ((RadDatePicker)userControl.FindControl("uxOverheadDate")).DateInput.SelectedDate.ToString();  
                            var editOverheadType = ((RadComboBox)userControl.FindControl("uxOverheadTypes")).SelectedItem.Value;  
                            var editAmount = Convert.ToDecimal(((RadNumericTextBox)userControl.FindControl("uxOverheadAmount")).Text);  
                            var editExchangeRate = Convert.ToDecimal(((RadNumericTextBox)userControl.FindControl("uxOverheadExchangeRate")).Text);  
                            var editDescription = ((RadTextBox)userControl.FindControl("uxOverheadDescription")).Text;  
                            var editUser = Session["IntraDotNet_DomainAccount"].ToString();  
 
                            UpdateOverheadExpense(editId, editDate, editOverheadType, editAmount, editExchangeRate, editDescription, editUser);  
                        }  
                    }  
                    uxExpenseGrid.MasterTableView.ClearEditItems();  
                }  
                else if (e.CommandName == RadGrid.CancelCommandName)  
                {  
                    if (Session != null && Session["editFormEntryId"] != null)  
                        Session.Contents.Remove("editFormEntryId");  
                }  
            } 

protected void EmployeeExpensesDataBind(object source, GridDetailTableDataBindEventArgs e)  
            {  
                var dataItem = e.DetailTableView.ParentItem;  
                var employeeId = Convert.ToInt32(dataItem["EmployeeId"].Text);  
                var expenseJob = dataItem["ExpenseJob"].Text;  
                var startDate = uxCustomDatePicker1.SelectedDate.Value.ToString();  
                var endDate = uxCustomDatePicker2.SelectedDate.Value.ToString();  
                var updatedExpenseTable = LoadEmployeeExpensesByType(employeeId, expenseJob, startDate, endDate);  
                e.DetailTableView.DataKeyNames = new string[] {"ExpenseJob"};  
                e.DetailTableView.DataSource = updatedExpenseTable;  
            } 

Again, any help being able to Sum a nested grid column would be awesome. This is something that is preventing the project from going live. Thank you.

2 Answers, 1 is accepted

Sort by
0
Arroyocode
Top achievements
Rank 1
answered on 17 Sep 2009, 04:56 PM
Error is "Amount is neither a DataColumn nor a DataRelation for table."

Sorry, went to edit post and was recommened to issue a reply rather than an edit.
0
Yavor
Telerik team
answered on 23 Sep 2009, 08:42 AM
Hi,

I reviewed the code, and the setup looks correct.
To further trace the issue, it will be best if you open a formal support ticket, and send us a small working project, demonstrating your logic, and showing the unwanted behavior.
We will review it locally, and get back to you with additional information.

Best wishes,
Yavor
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
Tags
Grid
Asked by
Arroyocode
Top achievements
Rank 1
Answers by
Arroyocode
Top achievements
Rank 1
Yavor
Telerik team
Share this question
or