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.