Can someone review my code. I have been struggling for the last few days. Everything works except that it is not updating when I click the update. It posts back, but the values remain.
I am using this example as a template: http://demos.telerik.com/aspnet-ajax/grid/examples/dataediting/clienteditbatchupdates/defaultcs.aspx
It probably has to do with namespace. I'm just learning and took it out.
Code behind
I am using this example as a template: http://demos.telerik.com/aspnet-ajax/grid/examples/dataediting/clienteditbatchupdates/defaultcs.aspx
It probably has to do with namespace. I'm just learning and took it out.
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="test.aspx.vb" Inherits="WebDataInput.test" %><%@ Register assembly="Telerik.Web.UI" namespace="Telerik.Web.UI" tagprefix="telerik" %><asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server"></asp:Content><asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"> <script type="text/javascript"> <!-- //Custom js code section used to edit records, store changes and switch the visibility of column editors //global variables for edited cell and edited rows ids var editedCell; var arrayIndex = 0; var editedItemsIds = []; function RowCreated(sender, eventArgs) { var dataItem = eventArgs.get_gridDataItem(); //traverse the cells in the created client row object and attach dblclick handler for each of them for (var i = 1; i < dataItem.get_element().cells.length; i++) { var cell = dataItem.get_element().cells[i]; if (cell) { $addHandler(cell, "dblclick", Function.createDelegate(cell, ShowColumnEditor)); } } } //detach the ondblclick handlers from the cells on row disposing function RowDestroying(sender, eventArgs) { if (eventArgs.get_id() === "") return; var row = eventArgs.get_gridDataItem().get_element(); var cells = row.cells; for (var j = 0, len = cells.length; j < len; j++) { var cell = cells[j]; if (cell) { $clearHandlers(cell); } } } function RowClick(sender, eventArgs) { if (editedCell) { //if the click target is table cell or span and there is an edited cell, update the value in it //skip update if clicking a span that happens to be a form decorator element (having a class that starts with "rfd") if ((eventArgs.get_domEvent().target.tagName == "TD") || (eventArgs.get_domEvent().target.tagName == "SPAN" && !eventArgs.get_domEvent().target.className.startsWith("rfd"))) { UpdateValues(sender); editedCell = false; } } } function ShowColumnEditor() { editedCell = this; //hide text and show column editor in the edited cell var cellText = this.getElementsByTagName("span")[0]; cellText.style.display = "none"; //display the span which wrapps the hidden checkbox editor if (this.getElementsByTagName("span")[1]) { this.getElementsByTagName("span")[1].style.display = ""; } var colEditor = this.getElementsByTagName("input")[0] || this.getElementsByTagName("select")[0]; //if the column editor is a form decorated select dropdown, show it instead of the original if (colEditor.className == "rfdRealInput" && colEditor.tagName.toLowerCase() == "select") colEditor = Telerik.Web.UI.RadFormDecorator.getDecoratedElement(colEditor); colEditor.style.display = ""; colEditor.focus(); } function StoreEditedItemId(editCell) { //get edited row key value and add it to the array which holds them var gridRow = $find(editCell.parentNode.id); var rowKeyValue = gridRow.getDataKeyValue("ContributionMasterID"); Array.add(editedItemsIds, rowKeyValue); } function HideEditor(editCell, editorType) { //get reference to the label in the edited cell var lbl = editCell.getElementsByTagName("span")[0]; switch (editorType) { case "textbox": var txtBox = editCell.getElementsByTagName("input")[0]; if (lbl.innerHTML != txtBox.value) { lbl.innerHTML = txtBox.value; editCell.style.border = "1px dashed"; StoreEditedItemId(editCell); } txtBox.style.display = "none"; break; case "checkbox": var chkBox = editCell.getElementsByTagName("input")[0]; if (lbl.innerHTML.toLowerCase() != chkBox.checked.toString()) { lbl.innerHTML = chkBox.checked; editedCell.style.border = "1px dashed"; StoreEditedItemId(editCell); } chkBox.style.display = "none"; editCell.getElementsByTagName("span")[1].style.display = "none"; break; case "dropdown": var ddl = editCell.getElementsByTagName("select")[0]; var selectedValue = ddl.options[ddl.selectedIndex].value; if (lbl.innerHTML != selectedValue) { lbl.innerHTML = selectedValue; editCell.style.border = "1px dashed"; StoreEditedItemId(editCell); } //if the form decorator was enabled, hide the decorated dropdown instead of the original. if (ddl.className == "rfdRealInput") ddl = Telerik.Web.UI.RadFormDecorator.getDecoratedElement(ddl); ddl.style.display = "none"; default: break; } lbl.style.display = "inline"; } function UpdateValues(grid) { //determine the name of the column to which the edited cell belongs var tHeadElement = grid.get_element().getElementsByTagName("thead")[0]; var headerRow = tHeadElement.getElementsByTagName("tr")[0]; var colName = grid.get_masterTableView().getColumnUniqueNameByCellIndex(headerRow, editedCell.cellIndex); //based on the column name, extract the value from the editor, update the text of the label and switch its visibility with that of the column //column. The update happens only when the column editor value is different than the non-editable value. We also set dashed border to indicate //that the value in the cell is changed. The logic is isolated in the HideEditor js method switch (colName) { case "PayDate": HideEditor(editedCell, "textbox"); break; case "Totals": HideEditor(editedCell, "textbox"); break; case "UnitPrice": HideEditor(editedCell, "textbox"); break; case "UnitsInStock": HideEditor(editedCell, "dropdown"); break; case "Discontinued": HideEditor(editedCell, "checkbox"); break; default: break; } } function CancelChanges() { if (editedItemsIds.length > 0) { $find("<%=RadAjaxManager1.ClientID %>").ajaxRequest(""); } else { alert("No pending changes to be discarded"); } editedItemsIds = []; } function ProcessChanges() { //extract edited rows ids and pass them as argument in the ajaxRequest method of the manager if (editedItemsIds.length > 0) { var Ids = ""; for (var i = 0; i < editedItemsIds.length; i++) { Ids = Ids + editedItemsIds[i] + ":"; } $find("<%=RadAjaxManager1.ClientID %>").ajaxRequest(Ids); } else { alert("No pending changes to be processed"); } editedItemsIds = []; } function RadGrid1_Command(sender, eventArgs) { //Note that this code has to be executed if you postback from external control instead from the grid (intercepting its onclientclick handler for this purpose), //otherwise the edited values will be lost or not propagated in the source if (editedItemsIds.length > 0) { if (eventArgs.get_commandName() == "Sort" || eventArgs.get_commandName() == "Page" || eventArgs.get_commandName() == "Filter") { if (confirm("Any unsaved edited values will be lost. Choose 'OK' to discard the changes before proceeding or 'Cancel' to abort the action and process them.")) { editedItemsIds = []; } else { //cancel the chosen action eventArgs.set_cancel(true); //process the changes ProcessChanges(); editedItemsIds = []; } } } } window.onunload = function () { //this code should also be executed on postback from external control (which rebinds the grid) to process any unsaved data if (editedItemsIds.length > 0) { if (confirm("Any unsaved edited values will be lost. Choose 'OK' to discard the changes before proceeding or 'Cancel' to abort the action and process them.")) { editedItemsIds = []; } else { //process the changes ProcessChanges(); editedItemsIds = []; } } }; --> </script> </telerik:RadCodeBlock> <telerik:RadFormDecorator ID="RadFormDecorator1" runat="server" DecoratedControls="Default,Select,Textbox" EnableRoundedCorners="false" /> <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> <AjaxSettings> <telerik:AjaxSetting AjaxControlID="RadGrid1"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="RadGrid1" LoadingPanelID="RadAjaxLoadingPanel1" /> <telerik:AjaxUpdatedControl ControlID="RadInputManager1" /> <telerik:AjaxUpdatedControl ControlID="Label1" /> </UpdatedControls> </telerik:AjaxSetting> <telerik:AjaxSetting AjaxControlID="RadAjaxManager1"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="RadGrid1" LoadingPanelID="RadAjaxLoadingPanel1" /> <telerik:AjaxUpdatedControl ControlID="RadInputManager1" /> <telerik:AjaxUpdatedControl ControlID="Label1" /> </UpdatedControls> </telerik:AjaxSetting> </AjaxSettings> </telerik:RadAjaxManager> <telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" /> <telerik:RadInputManager ID="RadInputManager1" EnableEmbeddedBaseStylesheet="false" Skin="" runat="server"> <telerik:TextBoxSetting BehaviorID="StringBehavior" EmptyMessage="type here" /> <telerik:NumericTextBoxSetting BehaviorID="CurrencyBehavior" EmptyMessage="type.." Type="Currency" Validation-IsRequired="true" MinValue="0" MaxValue="100000" /> <telerik:NumericTextBoxSetting BehaviorID="NumberBehavior" EmptyMessage="type.." Type="Number" DecimalDigits="0" MinValue="0" MaxValue="100" /> </telerik:RadInputManager> <telerik:RadGrid ID="RadGrid1" DataSourceID="SqlDataSource1" Width="97%" ShowStatusBar="True" AllowSorting="True" PageSize="15" GridLines="None" AllowPaging="True" runat="server" AutoGenerateColumns="False"> <MasterTableView TableLayout="Fixed" DataKeyNames="ContributionMasterID" EditMode="InPlace" ClientDataKeyNames="ContributionMasterID" CommandItemDisplay="Bottom"> <CommandItemTemplate> <div style="height: 30px; text-align: right;"><asp:Image ID="imgCancelChanges" runat="server" ImageUrl="../Images/cancelEditGrid.gif"AlternateText="Cancel changes" ToolTip="Cancel changes" Height="24px" Style="cursor: pointer;margin: 2px 5px 0px 0px;" onclick="CancelChanges();" /><asp:Image ID="imgProcessChanges" runat="server" ImageUrl="../Images/okEditGrid.gif"AlternateText="Process changes" ToolTip="Process changes" Height="24px" Style="cursor: pointer;margin: 2px 5px 0px 0px;" onclick="ProcessChanges();" /> </div> </CommandItemTemplate> <Columns> <telerik:GridBoundColumn UniqueName="ContributionMasterID" DataField="ContributionMasterID" HeaderText="ContributionMasterID" ReadOnly="True" HeaderStyle-Width="25%" SortExpression="ContributionMasterID" > <HeaderStyle Width="25%"></HeaderStyle> </telerik:GridBoundColumn> <telerik:GridTemplateColumn HeaderText="Totals" HeaderStyle-Width="15%" UniqueName="Totals"> <ItemTemplate> <asp:Label ID="lblTotals" runat="server" Text='<%# Eval("Totals", "{0:C}") %>' /> <asp:TextBox ID="txtTotals" runat="server" Text='<%# Eval("Totals", "{0:C}") %>' Style="display: none" /> </ItemTemplate> </telerik:GridTemplateColumn> </Columns> </MasterTableView> <ClientSettings> <ClientEvents OnRowCreated="RowCreated" OnRowClick="RowClick" OnCommand="RadGrid1_Command" OnRowDestroying="RowDestroying" /> </ClientSettings><HeaderContextMenu EnableAutoScroll="True"></HeaderContextMenu> </telerik:RadGrid> <br /> <asp:Label ID="Label1" runat="server" EnableViewState="false" /> <br /> <asp:SqlDataSource ID="SqlDataSource1" ConnectionString="<%$ ConnectionStrings:RemoteSQLConnection %>" SelectCommand="SELECT ContributionMasterID, Totals FROM tblContributionMaster" runat="server" UpdateCommand="UPDATE tblContributionMaster SET Totals = @Totals WHERE (ContributionMasterID = @ContributionMasterID)"> <UpdateParameters> <asp:Parameter Name="Totals"/> <asp:Parameter Name="ContributionMasterID"/> </UpdateParameters> </asp:SqlDataSource> </asp:Content>Code behind
Imports SystemImports Telerik.Web.UIImports System.CollectionsPublic Class test Inherits System.Web.UI.Page Private Sub SetMessage(ByVal message As String) Label1.Text = String.Format("<span>{0}</span>", message) End Sub Protected Sub RadGrid1_ItemCreated(ByVal sender As Object, ByVal e As GridItemEventArgs) Handles RadGrid1.ItemCreated If TypeOf e.Item Is GridDataItem Then Dim dataItem As GridDataItem = CType(e.Item, GridDataItem) '*************************************************************************************** Dim txtBox As TextBox txtBox = CType(dataItem.FindControl("txtTotals"), TextBox) Dim currencySetting As NumericTextBoxSetting = DirectCast(RadInputManager1.GetSettingByBehaviorID("CurrencyBehavior"), NumericTextBoxSetting) currencySetting.TargetControls.Add(New TargetInput(txtBox.UniqueID, True)) End If End Sub Protected Sub RadAjaxManager1_AjaxRequest(ByVal sender As Object, ByVal e As AjaxRequestEventArgs) Handles RadAjaxManager1.AjaxRequest If e.Argument = String.Empty Then RadGrid1.Rebind() End If Dim editedItemIds As String() = e.Argument.Split(":") Dim i As Integer For i = 0 To editedItemIds.Length - 2 Dim contributionmasterid As String = editedItemIds(i) Dim updatedItem As GridDataItem = CType(RadGrid1.MasterTableView.FindItemByKeyValue("ContributionMasterID", "String"), GridDataItem) UpdateValues(updatedItem) Next End Sub Protected Sub UpdateValues(ByVal updatedItem As GridDataItem) Dim txtBox As TextBox txtBox = CType(updatedItem.FindControl("txtTotals"), TextBox) SqlDataSource1.UpdateParameters("Totals").DefaultValue = txtBox.Text ' Dim ddl As DropDownList = CType(updatedItem.FindControl("ddlUnitsInStock"), DropDownList) 'SqlDataSource1.UpdateParameters("UnitsInStock").DefaultValue = ddl.SelectedValue 'Dim chkBox As CheckBox = CType(updatedItem.FindControl("chkBoxDiscontinued"), CheckBox) 'SqlDataSource1.UpdateParameters("Discontinued").DefaultValue = chkBox.Checked SqlDataSource1.UpdateParameters("ContributionMasterID").DefaultValue = updatedItem.GetDataKeyValue("ContributionMasterID").ToString() Try SqlDataSource1.Update() Catch ex As Exception SetMessage(Server.HtmlEncode("Unable to update Products. Reason: " + ex.StackTrace).Replace("'", "'").Replace(vbCrLf, "<br />")) End Try SetMessage("Product with ID: " & updatedItem.GetDataKeyValue("ContributionMasterID") & " updated") End SubEnd Class