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

GridInsertionObject error on hierarchy grid on expand of child grid

3 Answers 129 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Chad Johnson
Top achievements
Rank 1
Chad Johnson asked on 09 Jan 2013, 08:35 PM

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:

 

  1. Click the "Add New Case Number" button (the Case Number form template is displayed)
  2. 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)
  3. Click the "Add New Offense" button (the Offense form template is displayed)
  4. Click the expand/collapse button next to the Case Number to collapse the Offense form template
  5. 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.

3 Answers, 1 is accepted

Sort by
0
Antonio Stoilkov
Telerik team
answered on 14 Jan 2013, 08:25 AM
Hi Chad,

Based on your code I have tried to replicate the issue but to no avail. I have attached the project I used for testing. Note that I have removed the RadComboBox definition which could be causing the error. You could try to remove the RadComboBox SelectedValue binding and instead use the RadComboBox PreRender event to set the selected item.

If your issue still persists you could take a look at the provided page and modify it to show the unwanted behavior so we could further debug it and advise you with the best possible solution.

Regards,
Antonio Stoilkov
the Telerik team
If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
0
Chad Johnson
Top achievements
Rank 1
answered on 14 Jan 2013, 05:09 PM
Hi Antonio,

Thank you for your quick response.  I've looked at the page you sent and I agree with you that the RadComboBox is the problem.  Specifically, the problem is the SelectedValue binding.  Would you mind showing me an example of performing this binding in the PreRender event of the RadComboBox as you suggested?  I've been playing around with my code trying to modify it and I have to admit I'm just not getting it.  Thank you for your help!
0
Accepted
Antonio Stoilkov
Telerik team
answered on 17 Jan 2013, 11:59 AM
Hello Chad,

I have updated the project in order to show the desired functionality implemented. The main steps for resolving your issue are described below:
  • Subscribe to RadComboBox PreRender event
  • In the event event handler find the item by AgencyID and select it
protected void radComboBoxAgency_PreRender(object sender, EventArgs e)
{
    RadComboBox comboBox = sender as RadComboBox;
    GridEditableItem editableItem = comboBox.NamingContainer as GridEditableItem;
    if (editableItem.IsInEditMode && editableItem.ItemIndex != -1)
    {
        string agencyID = editableItem.GetDataKeyValue("AgencyID").ToString();
         
        // Simulation of adding the item. In your case there is no need
        // because you are binding it using a DataSource control.
        comboBox.Items.Add(new RadComboBoxItem(agencyID, agencyID));
        // End
 
        comboBox.FindItemByValue(agencyID).Selected = true;
    }
}
  • Include the AgencyID in the DataKeyNames of the Offenses GridTableView
<telerik:GridTableView DataKeyNames="OffenseID,AgencyID" runat="server" CommandItemDisplay="Top"
    TableLayout="Auto" Name="Offenses" NoDetailRecordsText="No Offense records to display">

All the best,
Antonio Stoilkov
the Telerik team
If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
Tags
Grid
Asked by
Chad Johnson
Top achievements
Rank 1
Answers by
Antonio Stoilkov
Telerik team
Chad Johnson
Top achievements
Rank 1
Share this question
or