I'm having a problem with using a popup edit form with a RadGrid.
We are in a completely disconnected environment - all data is retrieved and updated through a WCF web service and in general is returned as LLBLGen entities/EntityCollection(s). Nearly everything about this setup works (initial grid display, viewing the edit form in read-only, updating the database, etc.). All database functionality is working great - the code-behind commands fire fine and the data in the database is inserted/updated. The grid refreshes fine after inserts/updates as well, however, when performing an insert the popup editor stays on the screen and I get a javascript error:
"Insert item is available only when grid is in insert mode".
When I run in debug mode, it's not throwing the error anywhere in code-behind, but somewhere in all the auto-generated ajax javascript, so I can't tell what exactly is causing the error.
ASPX:
And the code behind:
I've tried all the suggestions from the forums that I could find, including doing the "e.Item.OwnerTableView.IsItemInserted = false;" command, doing a rebind after that, setting the AllowAutomaticInserts to false, etc.
Any ideas?
Thanks
-
Scott
We are in a completely disconnected environment - all data is retrieved and updated through a WCF web service and in general is returned as LLBLGen entities/EntityCollection(s). Nearly everything about this setup works (initial grid display, viewing the edit form in read-only, updating the database, etc.). All database functionality is working great - the code-behind commands fire fine and the data in the database is inserted/updated. The grid refreshes fine after inserts/updates as well, however, when performing an insert the popup editor stays on the screen and I get a javascript error:
"Insert item is available only when grid is in insert mode".
When I run in debug mode, it's not throwing the error anywhere in code-behind, but somewhere in all the auto-generated ajax javascript, so I can't tell what exactly is causing the error.
ASPX:
| <telerik:RadGrid ID="RadGrid1" runat="server" |
| AutoGenerateColumns="false" |
| AllowPaging="true" |
| AllowAutomaticInserts="false" |
| AllowAutomaticDeletes="false" |
| AllowAutomaticUpdates="false" |
| OnItemDataBound="RadGrid1_ItemDataBound" |
| OnNeedDataSource="RadGrid1_NeedDataSource" |
| OnInsertCommand="RadGrid1_InsertCommand" |
| OnUpdateCommand="RadGrid1_UpdateCommand" |
| OnPreRender="RadGrid1_PreRender" |
| > |
| <MasterTableView |
| EditMode="PopUp" |
| CommandItemDisplay="Top" |
| DataKeyNames="NoteID" |
| > |
| <EditFormSettings InsertCaption="Add new Note" /> |
| <Columns> |
| <telerik:GridEditCommandColumn UniqueName="EditCommandColumn" ButtonType="ImageButton" HeaderStyle-Width="35px" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" /> |
| <telerik:GridBoundColumn DataField="NoteID" UniqueName="NoteID" Visible="false" /> |
| <telerik:GridTemplateColumn HeaderText="!" UniqueName="Important" HeaderStyle-Font-Bold="true" HeaderStyle-Width="10px"> |
| <ItemTemplate> |
| <asp:Label ID="lblImportant" runat="server" ForeColor="Red" Text='<%# (bool)Eval("Important") ? "!" : "" %>' ToolTip="Note is marked as important" Font-Bold="true" /> |
| </ItemTemplate> |
| </telerik:GridTemplateColumn> |
| <telerik:GridBoundColumn HeaderText="Type" DataField="NoteType" UniqueName="NoteType" DataType="System.String" ItemStyle-Wrap="false" HeaderStyle-Width="110px" /> |
| <telerik:GridBoundColumn HeaderText="Recorded By" DataField="RecordedBy" UniqueName="RecordedBy" DataType="System.String" ReadOnly="true" HeaderStyle-Wrap="false" HeaderStyle-Width="120px" ItemStyle-Wrap="false" /> |
| <telerik:GridBoundColumn HeaderText="Date Created" DataField="ServerDate" UniqueName="ServerDate" DataType="System.DateTime" HeaderStyle-Wrap="false" HeaderStyle-Width="140px" ItemStyle-Wrap="true" /> |
| <telerik:GridBoundColumn HeaderText="Subject" DataField="SubjectSummary" UniqueName="SubjectSummary" DataType="System.String" /> |
| </Columns> |
| <EditFormSettings InsertCaption="Add new Note" CaptionFormatString="Edit Note" CaptionDataField="NoteID" EditFormType="Template"> |
| <FormTemplate> |
| <table cellpadding="4" cellspacing="0" width="100%" border="0"> |
| <tr> |
| <td style="width: 10px; white-space: nowrap; font-weight: bold;">Recorded By:</td> |
| <td> |
| <asp:Label ID="lblRecordedBy" runat="server" Text='<%# Bind("RecordedBy") %>' /> |
| </td> |
| <td style="font-weight: bold;">on</td> |
| <td> |
| <asp:Label ID="lblServerDate" runat="server" Text='<%# Bind("ServerDate") %>' /> |
| </td> |
| <td style="width: 10px; font-weight: bold;">Type:</td> |
| <td style="width: 114px;"> |
| <telerik:RadComboBox ID="cboType" runat="server" SkinID="RadCombo" Width="110px" /> |
| </td> |
| </tr> |
| </table> |
| <table cellpadding="4" cellspacing="0" width="100%" border="0"> |
| <tr> |
| <td style="width: 40px; font-weight: bold;">Subject:</td> |
| <td colspan="3"> |
| <telerik:RadTextBox ID="txtSubject" runat="server" |
| SkinID="RadTextBoxDefault" |
| Text='<%# DataBinder.Eval(Container.DataItem, "Subject") %>' |
| Width="100%" |
| /> |
| </td> |
| <td style="width: 40px; font-weight: bold;">Important?</td> |
| <td style="width: 10px;"><asp:CheckBox ID="chkImportant" runat="server" Checked='<%# (Container is GridEditFormInsertItem) ? false : Eval("Important") %>' /></td> |
| </tr> |
| <tr> |
| <td colspan="100%" valign="top" align="left"> |
| <telerik:RadEditor ID="radEditor_Note" runat="server" |
| Width="100%" |
| Height="250px" |
| Content='<%# DataBinder.Eval(Container.DataItem, "Note") %>' |
| AutoResizeHeight="true" |
| EditModes="Design" |
| ToolbarMode="Default" |
| > |
| <Tools> |
| <telerik:EditorToolGroup> |
| <telerik:EditorTool Name="Bold" /> |
| <telerik:EditorTool Name="Italic" /> |
| <telerik:EditorTool Name="Underline" /> |
| <telerik:EditorSeparator /> |
| <telerik:EditorTool Name="JustifyLeft" /> |
| <telerik:EditorTool Name="JustifyCenter" /> |
| <telerik:EditorTool Name="JustifyRight" /> |
| <telerik:EditorSeparator /> |
| <telerik:EditorTool Name="AjaxSpellCheck" /> |
| <telerik:EditorSeparator /> |
| <telerik:EditorTool Name="ToggleScreenMode" /> |
| </telerik:EditorToolGroup> |
| </Tools> |
| </telerik:RadEditor> |
| </td> |
| </tr> |
| </table> |
| <table width="100%" style="margin-top: 10px;"> |
| <tr> |
| <td align="right" colspan="100%"> |
| <asp:Button ID="btnUpdate" runat="server" |
| Text='<%# (Container is GridEditFormInsertItem) ? "Insert" : "Update" %>' |
| CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>' |
| SkinID="btnSearch" |
| Visible='<%# (AllowAdd || AllowEdit) ? true : false %>' |
| /> |
| |
| <asp:Button ID="btnCancel" runat="server" |
| Text='<%# (AllowAdd || AllowEdit) ? "Cancel" : "Close" %>' |
| CausesValidation="False" |
| CommandName="Cancel" |
| SkinID="btnSearch" |
| /> |
| </td> |
| </tr> |
| <tr> |
| <td colspan="100%"> |
| </td> |
| </tr> |
| </table> |
| <asp:Label ID="lblNoteTypeID" runat="server" Text='<%# Bind("NoteTypeID") %>' Visible="false" /> |
| </FormTemplate> |
| </EditFormSettings> |
| </MasterTableView> |
| <ClientSettings> |
| <ClientEvents OnRowDblClick="RowDblClick" OnPopUpShowing="PopUpShowing" /> |
| <Scrolling AllowScroll="true" /> |
| </ClientSettings> |
| </telerik:RadGrid> |
And the code behind:
| protected void RadGrid1_PreRender(object sender, EventArgs e) |
| { |
| // enable/disable command items based on security |
| foreach (GridCommandItem item in RadGrid1.MasterTableView.GetItems(GridItemType.CommandItem)) |
| { |
| if (!AllowAdd) |
| { |
| ((Button)item.FindControl("AddNewRecordButton")).Visible = false; |
| ((LinkButton)item.FindControl("InitInsertButton")).Visible = false; |
| } |
| ((LinkButton)item.FindControl("RebindGridButton")).Visible = false; |
| ((Button)item.FindControl("RefreshButton")).Visible = false; |
| } |
| } |
| protected void RadGrid1_NeedDataSource(object source, Telerik.Web.UI.GridNeedDataSourceEventArgs e) |
| { |
| LoadData(); |
| } |
| protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e) |
| { |
| if (e.Item is GridEditableItem && e.Item.IsInEditMode) |
| { |
| // get handles for the controls in the FormTemplate |
| GridEditableItem item = (GridEditableItem)e.Item; |
| Label lblNoteTypeID = item.FindControl("lblNoteTypeID") as Label; |
| Label lblRecordedBy = item.FindControl("lblRecordedBy") as Label; |
| Label lblServerDate = item.FindControl("lblServerDate") as Label; |
| RadComboBox cboType = item.FindControl("cboType") as RadComboBox; |
| RadTextBox txtSubject = item.FindControl("txtSubject") as RadTextBox; |
| CheckBox chkImportant = item.FindControl("chkImportant") as CheckBox; |
| RadEditor radEditor_Note = item.FindControl("radEditor_Note") as RadEditor; |
| Button btnUpdate = item.FindControl("btnUpdate") as Button; |
| Button btnCancel = item.FindControl("btnCancel") as Button; |
| string noteTypeID = lblNoteTypeID.Text; |
| // set the combo |
| switch (ForeignKeyType) |
| { |
| case ForeignKeyTypes.Branch: |
| bindComboToEnum(cboType, ListCategory.BranchNoteType); |
| break; |
| case ForeignKeyTypes.BranchProspect: |
| bindComboToEnum(cboType, ListCategory.BranchProspectNoteType); |
| break; |
| case ForeignKeyTypes.Recruit: |
| bindComboToEnum(cboType, ListCategory.RecruitNoteType); |
| break; |
| default: break; |
| } |
| // Edit versus Insert logic |
| if (e.Item.OwnerTableView.IsItemInserted) |
| { |
| // insert mode |
| lblRecordedBy.Text = CurrentUser.FullName; |
| lblServerDate.Text = DateTime.Now.ToString(); |
| } |
| else |
| { |
| // edit mode |
| cboType.SelectedIndex = cboType.Items.IndexOf(cboType.Items.FindItemByValue(noteTypeID)); |
| cboType.Enabled = AllowEdit; |
| txtSubject.ReadOnly = !AllowEdit; |
| chkImportant.Enabled = AllowEdit; |
| radEditor_Note.Enabled = AllowEdit; |
| btnUpdate.Visible = AllowEdit; |
| btnCancel.Text = "Close"; |
| } |
| } |
| else if (e.Item is GridHeaderItem) |
| { |
| GridHeaderItem headerItem = e.Item as GridHeaderItem; |
| headerItem["EditCommandColumn"].Text = AllowEdit ? "Edit" : "View"; |
| } |
| } |
| protected void RadGrid1_UpdateCommand(object source, GridCommandEventArgs e) |
| { |
| GridEditableItem item; |
| NoteEntity note; |
| int newNoteTypeID; |
| string msg = string.Empty; |
| item = e.Item as GridEditableItem; |
| newNoteTypeID = (item.FindControl("cboType") as RadComboBox).SelectedValue.ToInt(); |
| note = ServiceProxy.getService<INoteService>().Fetch(item.GetDataKeyValue("NoteID").ToString().ToInt(), FetchTypes.Heavy); |
| // update the note |
| note.Note = (item.FindControl("radEditor_Note") as RadEditor).Content; |
| note.Important = (item.FindControl("chkImportant") as CheckBox).Checked; |
| note.Subject = (item.FindControl("txtSubject") as RadTextBox).Text; |
| // update the note type |
| switch (ForeignKeyType) |
| { |
| case ForeignKeyTypes.Branch: |
| if (note.BranchNote != null) |
| note.BranchNote[0].BranchNoteTypeID = newNoteTypeID; |
| break; |
| case ForeignKeyTypes.BranchProspect: |
| if (note.BranchProspectNote != null) |
| note.BranchProspectNote[0].BranchProspectNoteTypeID = newNoteTypeID; |
| break; |
| case ForeignKeyTypes.Recruit: |
| if (note.RecruitApplicationNote != null && note.RecruitApplicationNote.Count > 0) |
| note.RecruitApplicationNote[0].RecruitNoteTypeID = newNoteTypeID; |
| break; |
| default: break; |
| } |
| // perform the save |
| note = ServiceProxy.getService<IEntityService>().EntitySave(note) as NoteEntity; |
| msg = note.StatusMessage; |
| if (msg.Length > 0) |
| { |
| lblStatusMessage.Text = msg; |
| lblStatusMessage.ForeColor = System.Drawing.Color.Red; |
| ErrorHandler.Handle(new Exception(msg), Request); |
| } |
| e.Item.OwnerTableView.ClearEditItems(); |
| LoadData(true); |
| } // RadGrid1_UpdateCommand |
| protected void RadGrid1_InsertCommand(object source, GridCommandEventArgs e) |
| { |
| GridEditableItem item; |
| NoteEntity note; |
| int newNoteTypeID; |
| string msg = string.Empty; |
| item = e.Item.OwnerTableView.GetInsertItem() as GridEditableItem; |
| note = new NoteEntity(); |
| newNoteTypeID = (item.FindControl("cboType") as RadComboBox).SelectedValue.ToInt(); |
| note.Note = (item.FindControl("radEditor_Note") as RadEditor).Content; |
| note.Important = (item.FindControl("chkImportant") as CheckBox).Checked; |
| note.Subject = (item.FindControl("txtSubject") as RadTextBox).Text; |
| note.ClientDate = DateTime.Now; |
| note.RecordedBy = CurrentUser.FullName; |
| // add the note type |
| switch (ForeignKeyType) |
| { |
| case ForeignKeyTypes.Branch: |
| BranchNoteEntity bne = new BranchNoteEntity(ForeignKey, note.NoteID); |
| note.BranchNote.Add(bne); |
| break; |
| case ForeignKeyTypes.BranchProspect: |
| BranchProspectNoteEntity bpne = new BranchProspectNoteEntity(ForeignKey.ToInt(), note.NoteID); |
| note.BranchProspectNote.Add(bpne); |
| break; |
| case ForeignKeyTypes.Recruit: |
| RecruitApplicationNoteEntity rne = new RecruitApplicationNoteEntity(ForeignKey.ToInt(), note.NoteID); |
| note.RecruitApplicationNote.Add(rne); |
| break; |
| default: break; |
| } |
| // perform the save |
| note = ServiceProxy.getService<IEntityService>().EntitySave(note) as NoteEntity; |
| msg = note.StatusMessage; |
| if (msg.Length > 0) |
| { |
| lblStatusMessage.Text = msg; |
| lblStatusMessage.ForeColor = System.Drawing.Color.Red; |
| ErrorHandler.Handle(new Exception(msg), Request); |
| } |
| e.Item.OwnerTableView.IsItemInserted = false; |
| LoadData(true); |
| } // RadGrid1_InsertCommand |
| private void LoadData() |
| { |
| LoadData(false); |
| } |
| private void LoadData(bool rebind) |
| { |
| DataSet dsSource = ServiceProxy.getService<INoteService>().FetchNotes(ForeignKeyType, ForeignKey, FetchTypes.Heavy); |
| if (dsSource.Tables.Count > 0) |
| { |
| DataColumn dc = new DataColumn("SubjectSummary", Type.GetType("System.String")); |
| dsSource.Tables[0].Columns.Add(dc); |
| foreach (DataRow dr in dsSource.Tables[0].Rows) |
| { |
| string summary = dr["Subject"].ToString().StripTags(); |
| dr["SubjectSummary"] = summary.Length < SummaryLength ? summary : string.Format("{0}...", summary.Left(SummaryLength - 3)); |
| } |
| RadGrid1.DataSource = dsSource; |
| if (rebind) |
| RadGrid1.DataBind(); |
| } |
| ErrorHandler.Handle(new ArgumentException(string.Format("No data was returned for the FetchNotes method:\n\nForeignKeyType: {0}\nForeignKey: {1}\n", ForeignKeyType, ForeignKey)), this.Request); |
| } |
I've tried all the suggestions from the forums that I could find, including doing the "e.Item.OwnerTableView.IsItemInserted = false;" command, doing a rebind after that, setting the AllowAutomaticInserts to false, etc.
Any ideas?
Thanks
-
Scott