Hi
I have a problem with radgrid in batch edit mode. I am trying to find out how I can get all values from all columns/rows when saving. I have not bound this grid to a simple datasource. Based on all data from the grid I need to create and populate a new class and send it to the server (via other functions). So I need to get all values from the grid so I can build and populate the correct class (datatable). My grid consist of both normal editable fields, read-only fields and radcombo boxes. Based on the value in my combobox I make columns read-only or not. I am trying to achive a mass update of a list<class>.
I need to find all values in code-behind! I can find the new values for updated editable fields this example
foreach (GridBatchEditingCommand command in e.Commands)
{
if ((command.Type == GridBatchEditingCommandType.Update))
{
Hashtable newValues = command.NewValues;
Hashtable oldValues = command.OldValues;
But I can not find out how I can get:
1. selected value from radcombobox (datasource for this combo is build on-click).
2. value from read-only columns in the grid.
<%@ Page Title="Mass update of requisition lines/Parts" Language="C#" MasterPageFile="~/SunFlower.Master" AutoEventWireup="true" CodeBehind="RequisitionLineMassUpdate.aspx.cs" Inherits="SunflowerWeb.RequisitionLineMassUpdate" %>
<%@ Register Assembly="Sunflower.Web.Controls" Namespace="Sunflower.Web.Controls" TagPrefix="sunflower" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<
asp:Content
ID
=
"MassUpdateContent"
ContentPlaceHolderID
=
"mcph"
runat
=
"server"
>
<
telerik:RadAjaxManagerProxy
ID
=
"ManagerProxy"
runat
=
"server"
>
<
AjaxSettings
>
<
telerik:AjaxSetting
AjaxControlID
=
"MasterAjaxManger"
>
<
UpdatedControls
>
</
UpdatedControls
>
</
telerik:AjaxSetting
>
<
telerik:AjaxSetting
AjaxControlID
=
"gridMassUpdate"
>
<
UpdatedControls
>
</
UpdatedControls
>
</
telerik:AjaxSetting
>
</
AjaxSettings
>
</
telerik:RadAjaxManagerProxy
>
<
telerik:RadCodeBlock
ID
=
"RadCodeBlock1"
runat
=
"server"
>
<
script
type
=
"text/javascript"
>
var ReqLineFunctions = new Array();
function saveAll() {
var grid1 = $find("<%=gridMassUpdate.ClientID%>");
var batchManager1 = grid1.get_batchEditingManager();
var hasChanges = batchManager1.hasChanges(grid1.get_masterTableView());
if (hasChanges) {
batchManager1.saveTableChanges([grid1.get_masterTableView()]);
} else {
var ajaxPanel = $find("<%=RadAjaxPanel1.ClientID%>");
ajaxPanel.ajaxRequest("saveChanges");
}
}
function GetSelectedFunction(sender, args) {
var batchManager = sender.get_batchEditingManager();
var masterTable = sender.get_masterTableView();
masterTable.get_dataItems();
var dataItem = $find(args.get_row().id);
var combo = dataItem.findControl("cbFunction");
var comboValue = combo.get_selectedItem().get_value();
return comboValue;
}
function GetReqLineId(sender, args) {
var batchManager = sender.get_batchEditingManager();
var masterTable = sender.get_masterTableView();
masterTable.get_dataItems();
var dataItem = $find(args.get_row().id);
var reqLineId = dataItem.findElement("lblReqLineId");
var reqLineIdValue = reqLineId.innerText;
return reqLineIdValue;
}
function batchEditOpening(sender, args) {
var selectedFunc = GetSelectedFunction(sender, args);
var reqLineId = GetReqLineId(sender, args);
if (selectedFunc !== null && reqLineId !== null) {
if (ReqLineFunctions.length > 0) {
//Is partnumber updatable
for (let i = 0; i <
ReqLineFunctions.length
; i++) {
if (ReqLineFunctions[i].ReqLineId === reqLineId) {
var
funcs
=
ReqLineFunctions
[i].Functions;
for (let
k
=
0
;k < funcs.length; k++) {
if (funcs[k].FunctionName === selectedFunc) {
if (!funcs[k].IsPartUpdatable) {
args.set_cancel(true);
}
}
}
}
}
}
}
}
function SelectFunction(sender, eventArgs) {
//todo: populate the rest of the columns based on the selected function
}
function GetFunctions(sender, args) {
var
text
=
args
._text;
itemsRequesting(sender, args);
//Dummy collection of functions. todo: replace with functions from api-call
var
funcs
=
new
Array();
funcs.push({
FunctionName: "SuppToTecOk",
FunctionDescription : "Receive from supplier",
IsPartUpdatable : true
});
funcs.push({
FunctionName: "TecOkToCust",
FunctionDescription : "Deliver to customer",
IsPartUpdatable : false
});
//add to global array so i can lookup and find values later
var
reqlineid
=
sender
.get_attributes().getAttribute("data-reqlineid");
if (reqlineid !== null) {
ReqLineFunctions.push({
ReqLineId: reqlineid,
Functions: funcs
})
}
FillCombo(sender, funcs);
sender.highlightAllMatches(sender.get_text());
}
// This cancels the default RadComboBox behavior
function itemsRequesting(sender, args) {
if (args.set_cancel != null) {
args.set_cancel(true);
}
if (sender.get_emptyMessage() == sender.get_text())
sender.set_text("");
}
function FillCombo(combo, functions) {
combo.clearItems();
combo.trackChanges();
for (var
i
=
0
; i < functions.length; i++) {
var
comboItem
=
new
Telerik.Web.UI.RadComboBoxItem();
comboItem.set_text(functions[i].FunctionDescription);
comboItem.set_value(functions[i].FunctionName);
combo.get_items().add(comboItem);
}
}
</script>
</
telerik:RadCodeBlock
>
<
telerik:RadAjaxPanel
runat
=
"server"
ID
=
"RadAjaxPanel1"
OnAjaxRequest
=
"RadAjaxPanel1_AjaxRequest"
>
<
h1
>Mass update parts</
h1
>
<
h4
><
asp:Label
ID
=
"litTip"
runat
=
"server"
Text
=
""
></
asp:Label
></
h4
>
<
div
class
=
"buttonFormBorderXL"
>
<
div
class
=
"fltlft buttons tools"
>
<
telerik:RadButton
runat
=
"server"
ID
=
"RadButton1"
AutoPostBack
=
"false"
Text
=
"Save all"
OnClientClicked
=
"saveAll"
></
telerik:RadButton
>
</
div
>
</
div
>
<
div
class
=
"box fltlft formXL clft"
>
<
img
src
=
"fwimages/form_curve01.gif"
class
=
"curve01"
alt
=
""
/>
<
img
src
=
"fwimages/form_curve02.gif"
class
=
"curve02"
alt
=
""
/>
<
br
/>
<
div
class
=
"simpleList"
>
<
telerik:RadGrid
ID
=
"gridMassUpdate"
renderMode
=
"Lightweight"
runat
=
"server"
OnNeedDataSource
=
"gridMassUpdate_NeedDataSource"
AllowAutomaticInserts
=
"True"
AllowPaging
=
"false"
AutoGenerateColumns
=
"False"
Skin
=
"SunflowerSkin"
EnableEmbeddedSkins
=
"False"
OnBatchEditCommand
=
"gridMassUpdate_BatchEditCommand"
CellSpacing
=
"0"
GridLines
=
"None"
Height
=
"680px"
>
<
ClientSettings
>
<
Scrolling
AllowScroll
=
"true"
UseStaticHeaders
=
"true"
/>
</
ClientSettings
>
<
AlternatingItemStyle
Font-Size
=
"8pt"
/>
<
MasterTableView
EditMode
=
"Batch"
PageSize
=
"50"
CommandItemDisplay
=
"None"
AllowPaging
=
"false"
DataKeyNames
=
"SearchResultRowId"
AutoGenerateColumns
=
"false"
>
<
BatchEditingSettings
EditType
=
"Cell"
/>
<
Columns
>
<
telerik:GridTemplateColumn
Visible
=
"true"
ReadOnly
=
"true"
UniqueName
=
"SearchResultRowId"
DataField
=
"SearchResultRowId"
HeaderText
=
"id"
>
<
ItemTemplate
>
<
telerik:RadLabel
ID
=
"lblReqLineId"
runat
=
"server"
Text='<%# Eval("SearchResultRowId")%>'></
telerik:RadLabel
>
</
ItemTemplate
>
</
telerik:GridTemplateColumn
>
<
telerik:GridNumericColumn
Visible
=
"true"
ReadOnly
=
"true"
DataField
=
"RequisitionNumber"
HeaderText
=
"Requisition"
AllowFiltering
=
"false"
>
</
telerik:GridNumericColumn
>
<
telerik:GridTemplateColumn
DataField
=
"PartNumber"
HeaderText
=
"Part"
UniqueName
=
"PartNumber"
>
<
ItemTemplate
>
<
telerik:RadLabel
ID
=
"lblPartNumber"
runat
=
"server"
Text='<%# Eval("PartNumber")%>'></
telerik:RadLabel
>
</
ItemTemplate
>
<
EditItemTemplate
>
<
telerik:RadTextBox
ID
=
"txtPartNumber"
runat
=
"server"
Text='<%# Eval("PartNumber")%>'></
telerik:RadTextBox
>
</
EditItemTemplate
>
</
telerik:GridTemplateColumn
>
<
telerik:GridBoundColumn
DataField
=
"PartDescription"
ReadOnly
=
"true"
HeaderText
=
"Description"
UniqueName
=
"PartDescription"
>
</
telerik:GridBoundColumn
>
<
telerik:GridTemplateColumn
HeaderText
=
"Function"
UniqueName
=
"SelectedFunction"
>
<
ItemTemplate
>
<
telerik:RadComboBox
ID
=
"cbFunction"
RenderMode
=
"Lightweight"
runat
=
"server"
EnableLoadOnDemand
=
"true"
EmptyMessage
=
"Select"
data-reqlineid='<%# Eval("SearchResultRowId")%>' OnClientItemsRequesting="GetFunctions" OnClientSelectedIndexChanged="SelectFunction" Text="Select">
</
telerik:RadComboBox
>
</
ItemTemplate
>
</
telerik:GridTemplateColumn
>
</
Columns
>
</
MasterTableView
>
<
ClientSettings
>
<
ClientEvents
OnBatchEditOpening
=
"batchEditOpening"
/>
</
ClientSettings
>
<
ItemStyle
Font-Size
=
"8pt"
/>
</
telerik:RadGrid
>
</
div
>
</
div
>
</
telerik:RadAjaxPanel
>
</
asp:Content
>
and code-behind:
using Sunflower.Web.Controls;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
namespace SunflowerWeb
{
public partial class RequisitionLineMassUpdate : System.Web.UI.Page
{
private bool saveChanges = false;
private List<
Sunflower.Business.RequisitionLineMassUpdate
> ReqLines
{
get
{
return (List<
Sunflower.Business.RequisitionLineMassUpdate
>)Session["ReqLines" + MassUpdateId];
}
}
public string MassUpdateId
{
get
{
return (string)ViewState["MassUpdateId"];
}
set
{
ViewState["MassUpdateId"] = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.QueryString["MassUpdateId"] == null && string.IsNullOrEmpty(MassUpdateId))
MassUpdateId = Guid.NewGuid().ToString();
else if (Request.QueryString["MassUpdateId"] != null)
MassUpdateId = Request.QueryString["MassUpdateId"];
}
}
protected void gridMassUpdate_BatchEditCommand(object sender, GridBatchEditingEventArgs e)
{
saveChanges = true;
//Trying to read all items....do not work!
foreach (GridDataItem item in gridMassUpdate.Items)
{
string func = item.Cells[4].Text; //radcombo
string part = item.Cells[2].Text; //radtexbox
}
foreach (GridBatchEditingCommand command in e.Commands)
{
if ((command.Type == GridBatchEditingCommandType.Update))
{
Hashtable newValues = command.NewValues;
Hashtable oldValues = command.OldValues;
try
{
string combinedId = newValues["SearchResultRowId"].ToString();
string partNumber = newValues["PartNumber"].ToString();
//NONONO. Not possible to get value from radcombobox. Why ?
string function = newValues["SelectedFunction"].ToString();
}
catch (Exception ex)
{
}
}
}
}
protected void Page_PreRender(object sender, EventArgs e)
{
if (saveChanges)
{
//Save the values from the other controls
}
}
protected void RadAjaxPanel1_AjaxRequest(object sender, AjaxRequestEventArgs e)
{
if (e.Argument == "saveChanges")
{
saveChanges = true;
}
}
protected void gridMassUpdate_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
if (ReqLines.Count > 0)
{
gridMassUpdate.DataSource = ReqLines;
}
}
}
}
Is it possible to get all values from an updated radgrid in batch mode ????
Best regards
Lars