I have a hierarchy radgrid that contains "Case Number" parent objects and "Offense" child objects and supports Insert/Update/Delete functionality.
I am getting the following error:
DataBinding: 'Telerik.Web.UI.GridInsertionObject' does not contain a property with the name 'AgencyID'.
To get this error I am performing the following actions:
- Click the "Add New Case Number" button (the Case Number form template is displayed)
- Fill in the required Case Number fields and click the insert button (upon doing this the "Add New Offense" button is displayed under the Case Number just inserted into the grid)
- Click the "Add New Offense" button (the Offense form template is displayed)
- Click the expand/collapse button next to the Case Number to collapse the Offense form template
- Click the expand/collapse button next to the Case Number to expand the Offense form template
The error occurs at this point!
My question is how do I go about fixing this problem?
My grid definition is as follows:
<telerik:RadGrid ID="radGridCaseNumbers" AutoGenerateColumns="false" AllowMultiRowEdit="false" Visible="false" runat="server" OnInsertCommand="radGridCaseNumbers_InsertCommand" OnUpdateCommand="radGridCaseNumbers_UpdateCommand" OnDeleteCommand="radGridCaseNumbers_DeleteCommand" OnNeedDataSource="radGridCaseNumbers_NeedDataSource" OnDetailTableDataBind="radGridCaseNumbers_DetailTableDataBind" OnItemCommand="radGridCaseNumbers_ItemCommand"> <MasterTableView CommandItemDisplay="Top" DataKeyNames="CaseNumberID" TableLayout="Auto" Name="CaseNumbers" HierarchyDefaultExpanded="true" NoMasterRecordsText="No Case Number records to display"> <DetailTables> <telerik:GridTableView DataKeyNames="OffenseID" runat="server" CommandItemDisplay="Top" TableLayout="Auto" Name="Offenses" NoDetailRecordsText="No Offense records to display"> <ParentTableRelation> <telerik:GridRelationFields DetailKeyField="CaseNumberID" MasterKeyField="CaseNumberID" /> </ParentTableRelation> <CommandItemTemplate> <div> <telerik:RadButton ID="radButtonAddOffense" runat="server" Text="Add New Offense" CommandName="InitInsert" Visible='<%# !radGridCaseNumbers.MasterTableView.IsItemInserted %>' ButtonType="StandardButton"> </telerik:RadButton> </div> </CommandItemTemplate> <Columns> <telerik:GridDropDownColumn HeaderText="Arresting PD" EnableEmptyListItem="true" DataField="AgencyID" ListTextField="Name" ListValueField="ID" DataSourceID="objectDataSourceAgencies"> </telerik:GridDropDownColumn> <telerik:GridEditCommandColumn ButtonType="PushButton" UniqueName="EditOffenseCommandColumn" /> <telerik:GridButtonColumn UniqueName="DeleteOffenseColumn" ButtonType="PushButton" Text="Delete" CommandName="Delete" /> </Columns> <EditFormSettings EditFormType="Template"> <FormTemplate> <div> <table cellpadding="0" cellspacing="0" class="tableContentControls"> <tr> <td class="tableCellRequiredField"><asp:Label Text="*" runat="server" CssClass="labelRequiredField" /></td> <td class="tableCellLabel"><asp:Label Text="Arresting PD:" runat="server" CssClass="labelDescription" /></td> <td class="tableCellControl"> <telerik:RadComboBox ID="radComboBoxAgency" AutoPostBack="true" EmptyMessage="(Select an Arresting PD)" EnableLoadOnDemand="true" DataSourceID="objectDataSourceAgencies" DataTextField="Name" DataValueField="ID" SelectedValue='<%# Bind("AgencyID") %>' Filter="StartsWith" runat="server" OnSelectedIndexChanged="radComboBoxAgency_SelectedIndexChanged"> </telerik:RadComboBox> </td> <td class="tableCellValidation"> <asp:RequiredFieldValidator ID="requiredFieldValidatorAgency" ControlToValidate="radComboBoxAgency" runat="server" ValidationGroup="validationGroup_Details_OffensesGrid"> <table> <tr> <td><asp:Image runat="server" ImageUrl="~/Images/ValidationError.png" /></td> <td><asp:Label runat="server" Text="Arresting PD is required" CssClass="labelValidationError" /></td> </tr> </table> </asp:RequiredFieldValidator> </td> </tr> <tr> <td colspan="4"> <telerik:RadButton ID="radButtonInsertUpdateOffense" CausesValidation="true" CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>' Text='<%# (Container is GridEditFormInsertItem) ? "Insert" : "Update" %>' ValidationGroup="validationGroup_Details_OffensesGrid" runat="server" OnClientClicking="performInsertOrUpdateOffense"> </telerik:RadButton> <telerik:RadButton ID="radButtonCancelInsertUpdateOffense" CausesValidation="false" CommandName="Cancel" Text="Cancel" runat="server" /> </td> </tr> </table> </div> </FormTemplate> </EditFormSettings> </telerik:GridTableView> </DetailTables> <CommandItemTemplate> <div> <telerik:RadButton ID="radButtonAddCaseNumber" runat="server" Text="Add New Case Number" CommandName="InitInsert" Visible='<%# !radGridCaseNumbers.MasterTableView.IsItemInserted %>' ButtonType="StandardButton"> </telerik:RadButton> </div> </CommandItemTemplate> <Columns> <telerik:GridBoundColumn HeaderText="Number" DataField="Number" HeaderStyle-Width="20" /> <telerik:GridDropDownColumn HeaderText="Type" EnableEmptyListItem="true" DataField="TypeID" ListTextField="Description" ListValueField="ID" DataSourceID="objectDataSourceCaseNumberTypes" HeaderStyle-Width="20" /> <telerik:GridEditCommandColumn ButtonType="PushButton" UniqueName="EditCaseNumberCommandColumn" HeaderStyle-Width="10" /> <telerik:GridButtonColumn UniqueName="DeleteCaseNumberColumn" ButtonType="PushButton" Text="Delete" CommandName="Delete" HeaderStyle-Width="200" /> </Columns> <EditFormSettings EditFormType="Template"> <FormTemplate> <div> <table> <tr> <td class="tableCellRequiredField"><asp:Label Text="*" runat="server" CssClass="labelRequiredField" /></td> <td class="tableCellLabel"><asp:Label Text="Number:" runat="server" CssClass="labelDescription" /></td> <td class="tableCellControl"><telerik:RadTextBox ID="radTextBoxNumber" Text='<%# Bind("Number") %>' runat="server" /></td> <td class="tableCellValidation"> <asp:RequiredFieldValidator ID="requiredFieldValidatorNumber" ControlToValidate="radTextBoxNumber" runat="server" ValidationGroup="validationGroup_Details_CaseNumbersGrid"> <table> <tr> <td><asp:Image runat="server" ImageUrl="~/Images/ValidationError.png" /></td> <td><asp:Label runat="server" Text="Number is required" CssClass="labelValidationError" /></td> </tr> </table> </asp:RequiredFieldValidator> </td> </tr> <tr> <td class="tableCellRequiredField"><asp:Label Text="*" runat="server" CssClass="labelRequiredField" /></td> <td class="tableCellLabel"><asp:Label Text="Type:" runat="server" CssClass="labelDescription" /></td> <td class="tableCellControl"> <telerik:RadComboBox ID="radComboBoxType" DataSourceID="objectDataSourceCaseNumberTypes" DataTextField="Description" DataValueField="ID" EmptyMessage="(Select a Type)" EnableLoadOnDemand="true" Filter="StartsWith" SelectedValue='<%# Bind("TypeID") %>' runat="server"> </telerik:RadComboBox> </td> <td class="tableCellValidation"> <asp:RequiredFieldValidator ID="requiredFieldValidatorType" ControlToValidate="radComboboxType" runat="server" ValidationGroup="validationGroup_Details_CaseNumbersGrid"> <table> <tr> <td><asp:Image runat="server" ImageUrl="~/Images/ValidationError.png" /></td> <td><asp:Label runat="server" Text="Type is required" CssClass="labelValidationError" /></td> </tr> </table> </asp:RequiredFieldValidator> </td> </tr> <tr> <td colspan="4"> <telerik:RadButton ID="radButtonInsertUpdateCaseNumber" CausesValidation="true" CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>' Text='<%# (Container is GridEditFormInsertItem) ? "Insert" : "Update" %>' ValidationGroup="validationGroup_Details_CaseNumbersGrid" runat="server" OnClientClicking="performInsertOrUpdateCaseNumber"> </telerik:RadButton> <telerik:RadButton ID="radButtonCancelInsertUpdateCaseNumber" CausesValidation="false" CommandName="Cancel" Text="Cancel" runat="server" /> </td> </tr> </table> </div> </FormTemplate> </EditFormSettings> </MasterTableView> <ValidationSettings CommandsToValidate="PerformInsert,Update" /></telerik:RadGrid>The code-behind for the grid is as follows:
public DataSet CaseNumbers { get { object obj = ViewState["CaseNumbers"]; if (obj != null) return (DataSet)obj; DataSet caseNumbers = new DataSet(); ReferralDb referralDb = new ReferralDb(); caseNumbers = referralDb.GetReferralCaseNumbers(Convert.ToInt32(hiddenFieldReferralID.Value)); ViewState["CaseNumbers"] = caseNumbers; return caseNumbers; } } public DataSet Offenses { get { object obj = ViewState["Offenses"]; if (obj != null) return (DataSet)obj; DataSet offenses = new DataSet(); ReferralDb referralDb = new ReferralDb(); offenses = referralDb.GetReferralOffenses(Convert.ToInt32(hiddenFieldReferralID.Value)); ViewState["Offenses"] = offenses; return offenses; } }protected void radGridCaseNumbers_DeleteCommand(object sender, GridCommandEventArgs e) { string id = null; DataTable dataTableOffenses = null; DataTable dataTableCaseNumbers = null; if ("Offenses".Equals(e.Item.OwnerTableView.Name)) { id = ((GridDataItem)e.Item).OwnerTableView.DataKeyValues[e.Item.ItemIndex]["OffenseID"].ToString(); dataTableOffenses = Offenses.Tables["Offense"]; if (dataTableOffenses.Rows.Find(id) != null) dataTableOffenses.Rows.Find(id).Delete(); } else if ("CaseNumbers".Equals(e.Item.OwnerTableView.Name)) { id = ((GridDataItem)e.Item).OwnerTableView.DataKeyValues[e.Item.ItemIndex]["CaseNumberID"].ToString(); dataTableCaseNumbers = CaseNumbers.Tables["CaseNumber"]; if (dataTableCaseNumbers.Rows.Find(id) != null) dataTableCaseNumbers.Rows.Find(id).Delete(); dataTableOffenses = Offenses.Tables["Offense"]; DataRow[] offenses = Offenses.Tables["Offense"].Select("CaseNumberID = " + id); foreach (DataRow dataRow in offenses) { id = dataRow["OffenseID"].ToString(); dataTableOffenses.Rows.Find(id).Delete(); } } } protected void radGridCaseNumbers_DetailTableDataBind(object sender, GridDetailTableDataBindEventArgs e) { GridDataItem gridDataItem = (GridDataItem)e.DetailTableView.ParentItem; int caseNumberID = (int)gridDataItem.GetDataKeyValue("CaseNumberID"); e.DetailTableView.DataSource = Offenses.Tables["Offense"].Select("CaseNumberID = " + caseNumberID.ToString()); Offenses.Tables["Offense"].PrimaryKey = new DataColumn[] { Offenses.Tables["Offense"].Columns["OffenseID"] }; } protected void radGridCaseNumbers_InsertCommand(object sender, GridCommandEventArgs e) { GridEditableItem gridEditableItem = null; DataTable dataTable = null; DataRow dataRowNew = null; DataRow[] allValues = null; Hashtable newValues = null; if ("Offenses".Equals(e.Item.OwnerTableView.Name)) { gridEditableItem = (GridEditableItem)e.Item; dataTable = Offenses.Tables["Offense"]; dataRowNew = dataTable.NewRow(); allValues = dataTable.Select("", "OffenseID", DataViewRowState.CurrentRows); if (allValues.Length > 0) dataRowNew["OffenseID"] = (int)allValues[allValues.Length - 1]["OffenseID"] + 1; else dataRowNew["OffenseID"] = 1; //table empty newValues = new Hashtable(); e.Item.OwnerTableView.ExtractValuesFromItem(newValues, gridEditableItem); try { foreach (DictionaryEntry entry in newValues) dataRowNew[(string)entry.Key] = entry.Value; GridDataItem parentItem = (GridDataItem)e.Item.OwnerTableView.ParentItem; dataRowNew["CaseNumberID"] = parentItem.OwnerTableView.DataKeyValues[parentItem.ItemIndex]["CaseNumberID"].ToString(); } catch { e.Canceled = true; } dataTable.Rows.Add(dataRowNew); } else if ("CaseNumbers".Equals(e.Item.OwnerTableView.Name)) { gridEditableItem = (GridEditableItem)e.Item; dataTable = CaseNumbers.Tables["CaseNumber"]; dataRowNew = dataTable.NewRow(); allValues = dataTable.Select("", "CaseNumberID", DataViewRowState.CurrentRows); if (allValues.Length > 0) dataRowNew["CaseNumberID"] = (int)allValues[allValues.Length - 1]["CaseNumberID"] + 1; else dataRowNew["CaseNumberID"] = 1; //table empty newValues = new Hashtable(); e.Item.OwnerTableView.ExtractValuesFromItem(newValues, gridEditableItem); try { foreach (DictionaryEntry entry in newValues) dataRowNew[(string)entry.Key] = entry.Value; } catch { e.Canceled = true; } dataTable.Rows.Add(dataRowNew); } } protected void radGridCaseNumbers_ItemCommand(object sender, GridCommandEventArgs e) { if (e.CommandName.Equals(RadGrid.EditCommandName)) radGridCaseNumbers.MasterTableView.IsItemInserted = false; if (e.CommandName.Equals(RadGrid.InitInsertCommandName)) radGridCaseNumbers.MasterTableView.ClearEditItems(); if ((e.CommandName.Equals(RadGrid.InitInsertCommandName)) && ("Offenses".Equals(e.Item.OwnerTableView.Name))) { if (e.Item.OwnerTableView.Items.Count.Equals(0)) { e.Canceled = true; System.Collections.Specialized.ListDictionary newVal = new System.Collections.Specialized.ListDictionary(); newVal["AgencyID"] = null; e.Item.OwnerTableView.InsertItem(newVal); } } } protected void radGridCaseNumbers_NeedDataSource(object sender, GridNeedDataSourceEventArgs e) { ((RadGrid)sender).DataSource = CaseNumbers; CaseNumbers.Tables["CaseNumber"].PrimaryKey = new DataColumn[] { CaseNumbers.Tables["CaseNumber"].Columns["CaseNumberID"] }; } protected void radGridCaseNumbers_UpdateCommand(object sender, GridCommandEventArgs e) { GridEditableItem gridEditableItem = null; DataTable dataTable = null; DataRow[] changedRows = null; Hashtable newValues = null; DataRow dataRowChanged = null; if ("Offenses".Equals(e.Item.OwnerTableView.Name)) { gridEditableItem = (GridEditableItem)e.Item; dataTable = Offenses.Tables["Offense"]; changedRows = dataTable.Select("OffenseID = " + gridEditableItem.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["OffenseID"]); newValues = new Hashtable(); e.Item.OwnerTableView.ExtractValuesFromItem(newValues, gridEditableItem); dataRowChanged = changedRows[0]; dataRowChanged.BeginEdit(); try { foreach (DictionaryEntry entry in newValues) dataRowChanged[(string)entry.Key] = entry.Value; dataRowChanged.EndEdit(); } catch { dataRowChanged.CancelEdit(); e.Canceled = true; } } else if ("CaseNumbers".Equals(e.Item.OwnerTableView.Name)) { gridEditableItem = (GridEditableItem)e.Item; dataTable = CaseNumbers.Tables["CaseNumber"]; changedRows = dataTable.Select("CaseNumberID = " + gridEditableItem.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["CaseNumberID"]); newValues = new Hashtable(); e.Item.OwnerTableView.ExtractValuesFromItem(newValues, gridEditableItem); dataRowChanged = changedRows[0]; dataRowChanged.BeginEdit(); try { foreach (DictionaryEntry entry in newValues) dataRowChanged[(string)entry.Key] = entry.Value; dataRowChanged.EndEdit(); } catch { dataRowChanged.CancelEdit(); e.Canceled = true; } } }I am already supressing a similar binding error in the ItemCommand event handler in the case where an insert is initiated into the "Offenses" detail table that is empty.
I was trying to do something similar in the case of an ExpandCollapse command but had no luck.