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:
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.
[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=" 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.