Hello,
I have a RadGrid that binds to a collection of custom object. In my application users can insert/update the rows of the grid and the changes will not be persisted to the database until they click on a save button. Each row has a key column containing the key value (ProviderLanguageID) assigned to each of the object when data is persisted to DB.
The grid's markup is like this:
<
telerik:RadGrid
ID
=
"grdProviderLanguage"
runat
=
"server"
AutoGenerateColumns
=
"False"
Height
=
"140px"
Width
=
"360px"
OnNeedDataSource
=
"grdProviderLanguage_NeedDataSource"
oninsertcommand
=
"grdProviderLanguage_InsertCommand"
onitemcommand
=
"grdProviderLanguage_ItemCommand"
CellSpacing
=
"0"
GridLines
=
"None"
onupdatecommand
=
"grdProviderLanguage_UpdateCommand"
onitemdatabound
=
"grdProviderLanguage_ItemDataBound"
>
<
ClientSettings
>
<
Selecting
AllowRowSelect
=
"True"
/>
<
KeyboardNavigationSettings
AllowActiveRowCycle
=
"True"
/>
<
Scrolling
AllowScroll
=
"True"
UseStaticHeaders
=
"True"
/>
</
ClientSettings
>
<
MasterTableView
CommandItemDisplay
=
"Top"
InsertItemDisplay
=
"Top"
EditMode
=
"InPlace"
EnableNoRecordsTemplate
=
"false"
DataKeyNames
=
"ProviderLanguageID"
>
<
CommandItemSettings
AddNewRecordImageUrl
=
"Images/AddNew.png"
AddNewRecordText
=
""
ShowRefreshButton
=
"false"
></
CommandItemSettings
>
<
RowIndicatorColumn
Visible
=
"False"
FilterControlAltText
=
"Filter RowIndicator column"
>
<
HeaderStyle
Width
=
"20px"
></
HeaderStyle
>
</
RowIndicatorColumn
>
<
ExpandCollapseColumn
Visible
=
"False"
FilterControlAltText
=
"Filter ExpandColumn column"
>
<
HeaderStyle
Width
=
"20px"
></
HeaderStyle
>
</
ExpandCollapseColumn
>
<
EditFormSettings
>
<
EditColumn
FilterControlAltText
=
"Filter EditCommandColumn column"
></
EditColumn
>
</
EditFormSettings
>
<
Columns
>
<
telerik:GridTemplateColumn
HeaderText
=
"Language"
UniqueName
=
"ProviderLanguage"
DataField
=
"ProviderLanguageID"
>
<
HeaderStyle
Width
=
"170px"
/>
<
ItemTemplate
>
<
asp:Label
ID
=
"lblLanguageName"
runat
=
"server"
Text='<%# Eval("LanguageObject.LanguageName") %>' />
</
ItemTemplate
>
<
EditItemTemplate
>
<
telerik:RadComboBox
ID
=
"cmbProviderLanguage"
runat
=
"server"
width
=
"130px"
EnableLoadOnDemand
=
"true"
DataValueField
=
"LanguageID"
DataTextField
=
"LAnguageObject.LanguageName"
OnItemsRequested
=
"cmbProviderLanguage_ItemsRequested"
Text='<%# Eval("LanguageObject.LanguageName") %>'>
</
telerik:RadComboBox
>
</
EditItemTemplate
>
</
telerik:GridTemplateColumn
>
<
telerik:GridCheckBoxColumn
HeaderText
=
"Primary"
UniqueName
=
"IsPrimary"
DataField
=
"IsPrimary"
/>
<
telerik:GridEditCommandColumn
ButtonType
=
"LinkButton"
InsertText
=
"Done"
EditText
=
"Edit"
CancelText
=
"Cancel"
UpdateText
=
"Done"
/>
</
Columns
>
</
MasterTableView
>
<
FilterMenu
EnableImageSprites
=
"False"
></
FilterMenu
>
</
telerik:RadGrid
>
When multiple rows are inserted to the grid, and one of the rows is subsequently edited (before saved to DB), the edited row is accessible in UpdateCommand event like this:
Guid editedItemID = new Guid(editedItem.OwnerTableView.DataKeyValues[editedItem.ItemIndex]["ProviderLanguageID"].ToString());
I'm using the key value to locate the actual custom object in the collection stored in the page.
This works if each of the record already has a key. When a new record is created, the key value is empty (Guid.Empty). So we'd have to use different means to locate the custom object. I'm thinking of comparing the SavedOldValues with the saved values to locate the actual object.
I notcied that e.Item.DataItem is null in UpdateCommand event, but not in ItemDataBound event. Is there any way we can access the custom object the row being updated is bound to?
Thanks in advance,
Makoto
<telerik:RadAjaxLoadingPanel id="LoadingPanel" cssclass="loading" transparency="20" Runat="server"> |
</telerik:RadAjaxLoadingPanel> |
<h3>Images <a href="javascript://" class="upload">Upload Image</a></h3> |
<div id="images"> |
<telerik:RadAjaxManager ID="ajaxManager" runat="server"> |
<AjaxSettings> |
<telerik:AjaxSetting AjaxControlID="dlImages"> |
<UpdatedControls> |
<telerik:AjaxUpdatedControl ControlID="ajaxPanelPaging" loadingpanelid="LoadingPanel" /> |
</UpdatedControls> |
</telerik:AjaxSetting> |
<telerik:ajaxsetting ajaxcontrolid="lnkPage"> |
<updatedcontrols> |
<telerik:ajaxupdatedcontrol controlid="ajaxPanelDataList" loadingpanelid="LoadingPanel" /> |
<telerik:ajaxupdatedcontrol controlid="ajaxPanelTabs" /> |
<telerik:AjaxUpdatedControl ControlID="ajaxPanelPaging" loadingpanelid="LoadingPanel" /> |
</updatedcontrols> |
</telerik:ajaxsetting> |
<telerik:ajaxsetting ajaxcontrolid="lnkCategory"> |
<updatedcontrols> |
<telerik:ajaxupdatedcontrol controlid="ajaxPanelDataList" loadingpanelid="LoadingPanel" /> |
<telerik:ajaxupdatedcontrol controlid="ajaxPanelTabs" loadingpanelid="LoadingPanel" /> |
<telerik:AjaxUpdatedControl ControlID="ajaxPanelPaging" loadingpanelid="LoadingPanel" /> |
</updatedcontrols> |
</telerik:ajaxsetting> |
<telerik:ajaxsetting ajaxcontrolid="lnkImageLibrary"> |
<updatedcontrols> |
<telerik:ajaxupdatedcontrol controlid="ajaxPanelDataList" loadingpanelid="LoadingPanel" /> |
<telerik:ajaxupdatedcontrol controlid="ajaxPanelTabs" /> |
<telerik:AjaxUpdatedControl ControlID="ajaxPanelPaging" loadingpanelid="LoadingPanel" /> |
</updatedcontrols> |
</telerik:ajaxsetting> |
</AjaxSettings> |
</telerik:RadAjaxManager> |
<telerik:RadAjaxPanel ID="ajaxPanelTabs" runat="server" > |
<ul class="tabs"> |
<li class="page"><asp:linkbutton id="lnkPage" runat="server" text="Images for this page" /></li> |
<li class="category"><asp:linkbutton id="lnkCategory" runat="server"/></li> |
<li class="library"><asp:linkbutton id="lnkImageLibrary" runat="server" text="Park Image Library"/></li> |
</ul> |
</telerik:RadAjaxPanel> |
<div class="data"> |
<telerik:RadAjaxPanel ID="ajaxPanelDataList" runat="server" LoadingPanelID="LoadingPanel"> |
<asp:datalist id="dlImages" repeatcolumns="6" cellspacing="2" repeatdirection="Horizontal" runat="server"> |
<itemtemplate> |
<div> |
<a rel="lightbox" href="<%=FullSizeURL %>"><asp:image id="imgThumb" runat="server"/></a> |
</div> |
<ul> |
<li><asp:linkbutton runat="server" id="lnkAdd" cssclass="add" title="Add image to this category" commandname="add">Add</asp:linkbutton></li> |
<li class="last"><asp:hyperlink id="lnkView" runat="server" target="_blank" cssclass="view" rel="lightbox" titlre="View this image">View</asp:hyperlink></li> |
</ul> |
</itemtemplate> |
</asp:datalist> |
</telerik:RadAjaxPanel> |
</div> |
<telerik:RadAjaxPanel id="ajaxPanelPaging" visible="true" runat="server"> |
<asp:linkbutton id="lnkFirstPage" runat="server">First Page</asp:linkbutton> |
<asp:repeater id="rptPaging" runat="server"> |
<headertemplate><ul class="verticalpager"></headertemplate> |
<itemtemplate> |
<li><asp:linkbutton id="lnkPageIndex" commandname="page" runat="server" /></li> |
</itemtemplate> |
<footertemplate></ul></footertemplate> |
</asp:repeater> |
</telerik:RadAjaxPanel> |
</div> |
void rptPaging_ItemDataBound(object sender, RepeaterItemEventArgs e) |
{ |
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) |
{ |
LinkButton lnkPageIndex = (LinkButton)e.Item.FindControl("lnkPageIndex"); |
lnkPageIndex.Text = (e.Item.ItemIndex + 1).ToString(); |
if (this.CurrentPage == e.Item.ItemIndex) { |
lnkPageIndex.CssClass = "selected"; |
} |
// THIS IS WHERE THE ERROR IS THROWN |
ajaxManager.AjaxSettings.AddAjaxSetting(lnkPageIndex, dlImages, LoadingPanel); |
} |
} |
<
telerik:RadGrid
runat
=
"server"
ID
=
"grdSquareFootage"
SkinID
=
"dgSOS"
OnNeedDataSource
=
"Grid_NeedDataSource"
OnItemDataBound
=
"Grid_ItemDataBound"
OnItemCommand
=
"Grid_ItemCommand"
OnDataBound
=
"Grid_DataBound"
>
<
MasterTableView
EditMode
=
"InPlace"
DataKeyNames
=
"FiscalYear,LocationId,FamilyOfBusinessId"
AllowPaging
=
"true"
AllowSorting
=
"true"
PageSize
=
"10"
>
<
Columns
>
<
telerik:GridEditCommandColumn
UniqueName
=
"UpdateButton"
ButtonType
=
"ImageButton"
EditImageUrl
=
"~/Images/Edit1.gif"
/>
<
telerik:GridButtonColumn
CommandName
=
"Delete"
UniqueName
=
"DeleteButton"
ButtonType
=
"ImageButton"
ImageUrl
=
"~/Images/Delete.gif"
ConfirmText
=
"Deleting this entry cannot be undone."
Text
=
"Delete"
/>
<
telerik:GridNumericColumn
DataField
=
"FiscalYear"
ReadOnly
=
"true"
HeaderText
=
"Year"
ItemStyle-Width
=
"60"
/>
<
telerik:GridNumericColumn
DataField
=
"LocationId"
UniqueName
=
"LocationId"
ReadOnly
=
"true"
HeaderText
=
"Store"
ItemStyle-Width
=
"60"
/>
<
telerik:GridNumericColumn
DataField
=
"FamilyOfBusinessId"
UniqueName
=
"FamilyOfBusinessId"
ReadOnly
=
"true"
HeaderText
=
"FOB"
ItemStyle-Width
=
"60"
/>
<
telerik:GridNumericColumn
DataField
=
"SquareFootage"
ColumnEditorID
=
"squareFootageEditor"
HeaderText
=
"Square Footage"
ItemStyle-Width
=
"60"
/>
</
Columns
>
</
MasterTableView
>
</
telerik:RadGrid
>
<
telerik:RadGrid
SkinID
=
"dgSOS"
runat
=
"server"
Skin
=
"VistaSOS"
AllowMultiRowEdit
=
"True"
AllowSorting
=
"True"
BorderColor
=
"Black"
GridLines
=
"Both"
Height
=
"90%"
>
<
ClientSettings
>
<
Scrolling
UseStaticHeaders
=
"True"
/>
</
ClientSettings
>
<
MasterTableView
AutoGenerateColumns
=
"False"
CommandItemDisplay
=
"None"
CurrentResetPageIndexAction
=
"SetPageIndexToFirst"
>
<
ExpandCollapseColumn
CurrentFilterFunction
=
"NoFilter"
FilterListOptions
=
"VaryByDataType"
Resizable
=
"False"
Visible
=
"False"
/>
<
RowIndicatorColumn
CurrentFilterFunction
=
"NoFilter"
FilterListOptions
=
"VaryByDataType"
Visible
=
"False"
/>
<
PagerStyle
Mode
=
"NextPrevAndNumeric"
NextPageText
=
"Next"
PrevPageText
=
"Previous"
AlwaysVisible
=
"true"
PrevPageImageUrl
=
"~/App_Themes/2011/Grid/PagingPrev.gif"
NextPageImageUrl
=
"~/App_Themes/2011/Grid/PagingNext.gif"
FirstPageImageUrl
=
"~/App_Themes/2011/Grid/PagingFirst.gif"
LastPageImageUrl
=
"~/App_Themes/2011/Grid/PagingLast.gif"
/>
<
HeaderStyle
Font-Bold
=
"False"
Font-Italic
=
"False"
Font-Overline
=
"False"
Font-Strikeout
=
"False"
Font-Underline
=
"False"
Wrap
=
"False"
/>
<
ItemStyle
Wrap
=
"false"
/>
<
AlternatingItemStyle
Wrap
=
"false"
/>
</
MasterTableView
>
</
telerik:RadGrid
>
<
telerik:RadPane
ID
=
"LeftPane"
runat
=
"Server"
Height
=
"100%"
MinWidth
=
"283"
MaxWidth
=
"283"
Width
=
"283"
>
<
telerik:RadSlidingZone
ID
=
"RadSlidingZoneLeft"
Skin
=
"Windows7"
runat
=
"server"
DockedPaneID
=
"RadSlidingPaneLeft"
BorderStyle
=
"None"
>
<
telerik:RadSlidingPane
ID
=
"RadSlidingPaneLeft"
Skin
=
"Windows7"
runat
=
"server"
MinWidth
=
"283"
MaxWidth
=
"283"
Width
=
"283"
EnableResize
=
"False"
Title
=
"Test"
Scrolling
=
"None"
>
<
telerik:RadSplitter
runat
=
"server"
ID
=
"RadSplitter3"
Height
=
"100%"
Orientation
=
"Horizontal"
MinWidth
=
"283"
MaxWidth
=
"283"
Width
=
"283"
CssClass
=
"BorderLeft"
>
<
telerik:RadPane
runat
=
"server"
ID
=
"Pane1"
BorderStyle
=
"None"
MinWidth
=
"283"
MaxWidth
=
"283"
Width
=
"283"
>
[...]
</
telerik:RadPane
>
<
telerik:RadPane
runat
=
"server"
ID
=
"Pane2"
BorderStyle
=
"None"
Height
=
"120px"
MinWidth
=
"283"
MaxWidth
=
"283"
Width
=
"283"
Scrolling
=
"Y"
>
[...]
</
telerik:RadPane
>
</
telerik:RadSplitter
>
</
telerik:RadSlidingPane
>
</
telerik:RadSlidingZone
>
</
telerik:RadPane
>
<
telerik:RadDatePicker ID="dtpDate" runat="server" onkeypress="dateStopEnter(this, event)"></telerik:RadDatePicker>
<
div
>
<
telerik:RadScriptManager
ID
=
"RadScriptManager1"
runat
=
"server"
>
</
telerik:RadScriptManager
>
<
telerik:RadAjaxPanel
ID
=
"rapBroker"
runat
=
"server"
>
<
telerik:RadFormDecorator
ID
=
"FormDecorator1"
runat
=
"server"
DecoratedControls
=
"Textbox"
ControlsToSkip
=
"Scrollbars"
>
</
telerik:RadFormDecorator
>
<
telerik:RadComboBox
ID
=
"rcbbBroker"
Runat
=
"server"
EnableTextSelection
=
"true"
Filter
=
"Contains"
MarkFirstMatch
=
"true"
AllowCustomText
=
"false"
DataSourceID
=
"sdsBroker"
DataTextField
=
"full_Name"
Width
=
"400px"
EmptyMessage
=
"Type a broker"
>
</
telerik:RadComboBox
>
</
telerik:RadAjaxPanel
>
<
asp:SqlDataSource
ID
=
"sdsBroker"
runat
=
"server"
ConnectionString="<%$ ConnectionStrings:ContractOnline%>"
SelectCommand="select full_Name from dbo.tblName_And_Address where broker_flag = 'Y' order by full_name "/>
</
div
>