I have done this before in my other project for previous client but still struggling with it. I have similar code but edit/insert is giving "Cannot insert Null into <fieldName>" error. It works in InPlace but not in webusercontrol. It looks like the value is not getting transferred from WebUserControl form to grid for update. I have attached the code and hope to get someone to point out what am I really missing this time.
It is not going to extractvalue method at all.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Units.aspx.cs"
Inherits="UMOLWeb.Views.Admin.Units" MasterPageFile="~/TopNav.Master" %>
<%@ MasterType VirtualPath="~/TopNav.master" %>
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
<
asp:Content
ID
=
"Content1"
ContentPlaceHolderID
=
"cphHtmlHeader"
runat
=
"server"
>
<
style
type
=
"text/css"
>
.EditFormHeader td {
background: #25A0DA;
padding: 10px 0px;
}
.rgRow, .rgAltRow, .rgHeader, .rtlR, .rtlA {
font-size: small !important;
padding: 0;
}
div.RadGrid_MetroTouch .rgHeader, div.RadGrid_MetroTouch th.rgResizeCol {
padding-top: 0;
padding-bottom: 0;
}
</
style
>
</
asp:Content
>
<
asp:Content
ID
=
"Content2"
ContentPlaceHolderID
=
"cphToolbar"
runat
=
"server"
>
</
asp:Content
>
<
asp:Content
ID
=
"Content3"
ContentPlaceHolderID
=
"cphContent"
runat
=
"server"
>
<
asp:Panel
runat
=
"server"
Visible
=
"false"
ID
=
"pnlContent"
Style
=
"height: 100%; margin: 0px"
>
<
telerik:RadScriptBlock
ID
=
"RadScriptBlock1"
runat
=
"server"
>
<
script
type
=
"text/javascript"
>
function PopUpShowing(sender, eventArgs) {
var myWidth = 0, myHeight = 0;
if (typeof (window.innerWidth) == 'number') {
//Non-IE
myWidth = window.innerWidth;
myHeight = window.innerHeight;
} else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
//IE 6+ in 'standards compliant mode'
myWidth = document.documentElement.clientWidth;
myHeight = document.documentElement.clientHeight;
} else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
//IE 4 compatible
myWidth = document.body.clientWidth;
myHeight = document.body.clientHeight;
}
popUp = eventArgs.get_popUp();
var gridWidth = sender.get_element().offsetWidth;
var gridHeight = sender.get_element().offsetHeight;
var popUpWidth = popUp.style.width.substr(0, popUp.style.width.indexOf("px"));
var popUpHeight = popUp.style.height.substr(0, popUp.style.height.indexOf("px"));
popUp.style.left = ((myWidth - popUpWidth) / 2 + sender.get_element().offsetLeft).toString() + "px";
var posy = document.body.scrollTop + document.documentElement.scrollTop;
popUp.style.top = (posy + sender.get_element().offsetTop + 100).toString() + "px";
}
function RowDblClick(sender, eventArgs) {
sender.get_masterTableView().editItem(eventArgs.get_itemIndexHierarchical());
}
</
script
>
</
telerik:RadScriptBlock
>
<
telerik:RadAjaxManager
ID
=
"RadAjaxManager1"
runat
=
"server"
DefaultLoadingPanelID
=
"RadAjaxLoadingPanel1"
>
<
AjaxSettings
>
<
telerik:AjaxSetting
AjaxControlID
=
"RadGrid1"
>
<
UpdatedControls
>
<
telerik:AjaxUpdatedControl
ControlID
=
"RadGrid1"
></
telerik:AjaxUpdatedControl
>
</
UpdatedControls
>
</
telerik:AjaxSetting
>
</
AjaxSettings
>
</
telerik:RadAjaxManager
>
<
telerik:RadWindowManager
ID
=
"RadWindowManager1"
runat
=
"server"
></
telerik:RadWindowManager
>
<
telerik:RadSplitter
ID
=
"RadSplitter1"
runat
=
"server"
Width
=
"100%"
Height
=
"100%"
HeightOffset
=
"175"
Skin
=
"MetroTouch"
BorderSize
=
"0"
>
<
telerik:RadPane
ID
=
"RadPane1"
runat
=
"server"
Scrolling
=
"Y"
>
<
telerik:RadGrid
ID
=
"RadGrid1"
runat
=
"server"
DataSourceID
=
"SqlDataSource1"
AutoGenerateColumns
=
"false"
BorderWidth
=
"0"
AllowAutomaticUpdates
=
"true"
AllowAutomaticInserts
=
"true"
DataKeyNames
=
"ID"
AllowSorting
=
"true"
Skin
=
"Windows7"
EnableTheming
=
"false"
AllowPaging
=
"false"
PagerStyle-Mode
=
"NextPrev"
PagerStyle-Position
=
"Top"
PageSize
=
"12"
ShowGroupPanel
=
"True"
OnItemUpdated
=
"RadGrid1_ItemUpdated"
>
<
MasterTableView
DataSourceID
=
"SqlDataSource1"
AutoGenerateColumns
=
"False"
DataKeyNames
=
"ID"
CommandItemDisplay
=
"Top"
EditMode
=
"Popup"
AllowMultiColumnSorting
=
"true"
AllowAutomaticUpdates
=
"true"
AllowAutomaticInserts
=
"true"
>
<
GroupByExpressions
>
<
telerik:GridGroupByExpression
>
<
SelectFields
>
<
telerik:GridGroupByField
FieldAlias
=
"Region"
FieldName
=
"Region"
></
telerik:GridGroupByField
>
</
SelectFields
>
<
GroupByFields
>
<
telerik:GridGroupByField
FieldName
=
"Region"
></
telerik:GridGroupByField
>
</
GroupByFields
>
</
telerik:GridGroupByExpression
>
<
telerik:GridGroupByExpression
>
<
SelectFields
>
<
telerik:GridGroupByField
FieldAlias
=
"BusinessUnit"
FieldName
=
"BusinessUnit"
></
telerik:GridGroupByField
>
</
SelectFields
>
<
GroupByFields
>
<
telerik:GridGroupByField
FieldName
=
"BusinessUnit"
></
telerik:GridGroupByField
>
</
GroupByFields
>
</
telerik:GridGroupByExpression
>
<
telerik:GridGroupByExpression
>
<
SelectFields
>
<
telerik:GridGroupByField
FieldAlias
=
"Area"
FieldName
=
"Area"
></
telerik:GridGroupByField
>
</
SelectFields
>
<
GroupByFields
>
<
telerik:GridGroupByField
FieldName
=
"Area"
></
telerik:GridGroupByField
>
</
GroupByFields
>
</
telerik:GridGroupByExpression
>
</
GroupByExpressions
>
<
Columns
>
<
telerik:GridEditCommandColumn
ButtonType
=
"ImageButton"
HeaderText
=
"Edit"
>
</
telerik:GridEditCommandColumn
>
<
telerik:GridBoundColumn
DataField
=
"UnitNo"
HeaderText
=
"Unit"
SortExpression
=
"UnitNo"
UniqueName
=
"UnitNo"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"UnitType"
HeaderText
=
"UnitType"
SortExpression
=
"UnitType"
UniqueName
=
"UnitType"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"HorsePower"
HeaderText
=
"FERCHP"
SortExpression
=
"HorsePower"
UniqueName
=
"HorsePower"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"Engine"
HeaderText
=
"Engine"
SortExpression
=
"Engine"
UniqueName
=
"Engine"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"Region"
HeaderText
=
"Region"
SortExpression
=
"Region"
UniqueName
=
"Region"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"BusinessUnit"
HeaderText
=
"BU"
SortExpression
=
"BusinessUnit"
UniqueName
=
"BusinessUnit"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"Area"
HeaderText
=
"Area"
SortExpression
=
"Area"
UniqueName
=
"Area"
>
</
telerik:GridBoundColumn
>
<
telerik:GridBoundColumn
DataField
=
"Station"
HeaderText
=
"Station"
SortExpression
=
"Station"
UniqueName
=
"Station"
>
</
telerik:GridBoundColumn
>
<
telerik:GridCheckBoxColumn
DataField
=
"IsActive"
DataType
=
"System.Boolean"
HeaderText
=
"Active"
runat
=
"server"
></
telerik:GridCheckBoxColumn
>
</
Columns
>
<
EditFormSettings
CaptionDataField
=
"UnitNo"
CaptionFormatString
=
"Edit Information for Unit: {0}"
EditFormType
=
"WebUserControl"
UserControlName
=
"~/Views/Controls/EditUnitDetails.ascx"
InsertCaption
=
"New Unit"
>
<
FormTableItemStyle
Wrap
=
"False"
Width
=
"400px"
></
FormTableItemStyle
>
<
FormCaptionStyle
CssClass
=
"EditFormHeader"
></
FormCaptionStyle
>
<
FormMainTableStyle
GridLines
=
"None"
CellSpacing
=
"1"
CellPadding
=
"3"
/>
<
FormTableStyle
CellSpacing
=
"0"
CellPadding
=
"2"
Height
=
"150px"
/>
<
EditColumn
ButtonType
=
"ImageButton"
InsertText
=
"Insert Location"
UpdateText
=
"Update record"
UniqueName
=
"EditCommandColumn1"
CancelText
=
"Cancel edit"
>
</
EditColumn
>
<
FormTableButtonRowStyle
HorizontalAlign
=
"Left"
CssClass
=
"EditFormButtonRow"
></
FormTableButtonRowStyle
>
</
EditFormSettings
>
</
MasterTableView
>
<
ClientSettings
AllowGroupExpandCollapse
=
"True"
AllowDragToGroup
=
"True"
>
<
ClientEvents
OnPopUpShowing
=
"PopUpShowing"
/>
<
ClientEvents
OnRowDblClick
=
"RowDblClick"
/>
</
ClientSettings
>
<
GroupingSettings
ShowUnGroupButton
=
"true"
></
GroupingSettings
>
</
telerik:RadGrid
>
</
telerik:RadPane
>
</
telerik:RadSplitter
>
<
telerik:RadAjaxLoadingPanel
ID
=
"RadAjaxLoadingPanel1"
runat
=
"server"
Skin
=
"Windows7"
>
</
telerik:RadAjaxLoadingPanel
>
</
asp:Panel
>
<
asp:Panel
ID
=
"pnlError"
runat
=
"server"
Visible
=
"false"
>
<
table
>
<
tr
>
<
td
style
=
"color: red; font-weight: bold"
>
<
asp:Label
runat
=
"server"
ID
=
"lblError"
></
asp:Label
></
td
>
</
tr
>
</
table
>
</
asp:Panel
>
<
asp:SqlDataSource
ID
=
"SqlDataSource1"
runat
=
"server"
ConnectionString="<%$ ConnectionStrings:WebAppConnectionString %>"
SelectCommand="SELECT U.ID,UnitNo, UnitType, EngineType, Model, Manufacturer, HorsePower, CSLocation, UsedforUnitMaintenance, Region, BusinessUnit,Area, Station, CASE WHEN U.[IsActive] =1 THEN 'true' Else 'false' END AS IsActive, LocationId FROM Units U INNER JOIN Location L ON LocationId = L.Id ORDER BY Region, BusinessUnit, Area, Station"
UpdateCommand="UPDATE Units SET [UnitNo] = @UnitNo, [UnitType] = @UnitType, [EngineType] = @EngineType, [Model] = @Model, [Manufacturer] = @Manufacturer, [HorsePower] = @HorsePower, [CSLocation] = @CSLocation, [UsedforUnitMaintenance] = @UsedforUnitMaintenance, [LocationId] = @LocationId, IsActive=@IsActive WHERE [ID] = @ID">
<
InsertParameters
>
<
asp:Parameter
Name
=
"UnitNo"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"UnitType"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"EngineType"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"Model"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"Manufacturer"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"HorsePower"
Type
=
"Int32"
/>
<
asp:Parameter
Name
=
"CSLocation"
Type
=
"Boolean"
/>
<
asp:Parameter
Name
=
"UsedforUnitMaintenance"
Type
=
"Boolean"
/>
<
asp:Parameter
Name
=
"LocationId"
Type
=
"Int16"
/>
<
asp:Parameter
Name
=
"IsActive"
Type
=
"Boolean"
/>
</
InsertParameters
>
<
UpdateParameters
>
<
asp:Parameter
Name
=
"UnitNo"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"UnitType"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"EngineType"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"Model"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"Manufacturer"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"HorsePower"
Type
=
"String"
/>
<
asp:Parameter
Name
=
"CSLocation"
Type
=
"Boolean"
/>
<
asp:Parameter
Name
=
"UsedforUnitMaintenance"
Type
=
"Boolean"
/>
<
asp:Parameter
Name
=
"LocationId"
Type
=
"Int16"
/>
<
asp:Parameter
Name
=
"IsActive"
Type
=
"Boolean"
/>
<
asp:Parameter
Name
=
"Id"
Type
=
"Int16"
/>
</
UpdateParameters
>
</
asp:SqlDataSource
>
</
asp:Content
>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Text;
namespace UMOLWeb.Views.Admin
{
public partial class Units : System.Web.UI.Page
{
public string PAGE_FUNCTION = "Units Information";
const string PAGE_DESCRIPTION = "Adit/Edit Location, Unit and Task Information";
private string gridMessage = null;
protected void Page_Load(object sender, EventArgs e)
{
if (Roles.IsUserInRole("Manager") && Roles.IsUserInRole("ITSupport"))
{
pnlContent.Visible = true;
}
else
{
lblError.Text = "You are not authorized to view this page";
pnlError.Visible = true;
}
}
protected void RadGrid1_ItemUpdated(object sender, Telerik.Web.UI.GridUpdatedEventArgs e)
{
// Show messages on Update
if ((e.Exception != null))
{
e.ExceptionHandled = true;
e.KeepInEditMode = true;
var aMsg = e.Exception.Message.ToString().Split(';');
SetMessage("<
b
>Record cannot be updated</
b
>.<
br
/>Reason:" + String.Format("<
span
style
=
'color:red'
>" + aMsg[0] + "</
span
>"));
}
else
{
SetMessage("Record is Updated!");
}
}
private void SetMessage(string message)
{
gridMessage = message.Replace("'", "\\'").Replace("\n", "<
br
/>");
}
private void DisplayMessage(string text)
{
//Show the error message on the RadWindow
string msg = "radalert('" + gridMessage + "',500,100);";
RadAjaxManager1.ResponseScripts.Add(msg);
}
#region "Master Page Settings"
protected void Page_PreRender(object sender, System.EventArgs e)
{
var _m = Master;
_m.PageFunction = PAGE_FUNCTION;
_m.PageDescription = PAGE_DESCRIPTION;
if (!(String.IsNullOrEmpty(gridMessage)))
DisplayMessage(gridMessage);
}
#endregion
}
}
<%@ Control Language="C#" CodeBehind="EditUnitDetails.ascx.cs" Inherits="UMOLWeb.Views.Controls.EditUnitDetails" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<
table
>
<
tr
>
<
td
>Location:
</
td
>
<
td
>
<
telerik:RadComboBox
DataTextField
=
"Location"
DropDownAutoWidth
=
"Enabled"
DataValueField
=
"Id"
DataSourceID
=
"sqlDataSrc1"
ShowMoreResultsBox
=
"true"
Width
=
"300px"
EnableLoadOnDemand
=
"true"
UniqueName
=
"Location"
Filter
=
"Contains"
AutoPostBack
=
"true"
ID
=
"LocationId"
ItemsPerRequest
=
"10"
runat
=
"server"
>
</
telerik:RadComboBox
>
</
td
>
</
tr
>
<
tr
>
<
td
>Unit No:
</
td
>
<
td
>
<
asp:TextBox
runat
=
"server"
ID
=
"UnitNo"
Text='<%# DataBinder.Eval(DataItem, "UnitNo")%>'></
asp:TextBox
>
</
td
>
</
tr
>
<
tr
>
<
td
>Unit Type:
</
td
>
<
td
>
<
asp:TextBox
runat
=
"server"
ID
=
"UnitType"
Text='<%# DataBinder.Eval(DataItem, "UnitType")%>'></
asp:TextBox
>
</
td
>
</
tr
>
<
tr
>
<
td
>Engine Type:
</
td
>
<
td
>
<
asp:TextBox
runat
=
"server"
ID
=
"EngineType"
Text='<%# DataBinder.Eval(DataItem, "EngineType")%>'></
asp:TextBox
>
</
td
>
</
tr
>
<
tr
>
<
td
>Manufacturer:
</
td
>
<
td
>
<
asp:TextBox
runat
=
"server"
ID
=
"Manufacturer"
Text='<%# DataBinder.Eval(DataItem, "Manufacturer")%>'></
asp:TextBox
>
</
td
>
</
tr
>
<
tr
>
<
td
>Model:
</
td
>
<
td
>
<
asp:TextBox
runat
=
"server"
ID
=
"Model"
Text='<%# DataBinder.Eval(DataItem, "Model")%>'></
asp:TextBox
>
</
td
>
</
tr
>
<
tr
>
<
td
>HorsePower:
</
td
>
<
td
>
<
asp:TextBox
runat
=
"server"
ID
=
"HorsePower"
Text='<%# DataBinder.Eval(DataItem, "HorsePower")%>'></
asp:TextBox
>
</
td
>
</
tr
>
<
tr
>
<
td
>CS Location:
</
td
>
<
td
>
<
asp:CheckBox
runat
=
"server"
ID
=
"CSLocation"
Checked='<%# DataBinder.Eval(DataItem, "CSLocation")%>' />
</
td
>
</
tr
>
<
tr
>
<
td
>Used for Maintenance:
</
td
>
<
td
>
<
asp:CheckBox
runat
=
"server"
ID
=
"UsedforUnitMaintenance"
Checked='<%# DataBinder.Eval(DataItem, "UsedforUnitMaintenance")%>' />
</
td
>
</
tr
>
<
tr
>
<
td
>Active:
</
td
>
<
td
>
<
asp:CheckBox
runat
=
"server"
ID
=
"IsActive"
Checked='<%# Convert.ToBoolean(DataBinder.Eval(DataItem, "IsActive"))%>' />
</
td
>
</
tr
>
<
tr
>
<
td
>
<
div
class
=
"Form_Buttons"
>
<
asp:LinkButton
ID
=
"btnSave"
runat
=
"server"
Text
=
"Save"
CommandName
=
"Update"
Visible='<%# !(DataItem is Telerik.Web.UI.GridInsertionObject) %>' />
<
asp:LinkButton
ID
=
"btnAdd"
runat
=
"server"
Text
=
"Insert"
CommandName
=
"PerformInsert"
Visible='<%# (DataItem is Telerik.Web.UI.GridInsertionObject) %>' />
<
asp:LinkButton
ID
=
"btnCancel"
runat
=
"server"
Text
=
"Cancel"
CausesValidation
=
"false"
CommandName
=
"Cancel"
/>
</
div
>
</
td
>
</
tr
>
</
table
>
<
asp:SqlDataSource
ID
=
"sqlDataSrc1"
runat
=
"server"
ConnectionString="<%$ ConnectionStrings:WebAppConnectionString %>"
SelectCommand="SELECT Region + '-' + BusinessUnit + '-' + Area + '-' + Station AS 'Location', Id FROM [Location]"></
asp:SqlDataSource
>
<
asp:SqlDataSource
ID
=
"sqlDataSrc2"
runat
=
"server"
ConnectionString="<%$ ConnectionStrings:WebAppConnectionString %>"></
asp:SqlDataSource
>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections.Specialized;
using System.Data;
using Telerik.Web.UI;
using UMOLWeb.Shared;
using UMOLWeb.Models;
namespace UMOLWeb.Views.Controls
{
#region "events"
public partial class EditUnitDetails : System.Web.UI.UserControl, IBindableControl
{
private object _dataItem = null;
public object DataItem
{
get{return this._dataItem;}
set{this._dataItem = value;}
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Page_PreRender(object sender, EventArgs e)
{
if (!(DataItem is Telerik.Web.UI.GridInsertionObject))
{
DataRowView drv = (DataRowView)_dataItem;
if (drv != null)
{
RadComboBoxItem loc = new RadComboBoxItem();
loc.Text = drv.Row["Region"].ToString() + "-" + drv.Row["BusinessUnit"].ToString() + "-" + drv.Row["Area"].ToString() + "-" + drv.Row["Station"].ToString();
loc.Value = drv.Row["LocationId"].ToString();
LocationId.Items.Add(loc);
loc.Selected = true;
loc.DataBind();
}
}
}
void IBindableControl.ExtractValues(IOrderedDictionary Dictionary)
{
try
{
//retrives all Textbox and add thier values to the dictionary
foreach (object ctrl in Controls)
{
if ((ctrl is TextBox))
{
// //OfType<
TextBox
>().Select(control => new { FieldName = control.ID, FieldValue = control.Text }))
Dictionary.Add(((TextBox)ctrl).ID, ((TextBox)ctrl).Text);
}
if (ctrl is RadComboBox)
{
Dictionary.Add(((RadComboBox)ctrl).ID, ((RadComboBox)ctrl).SelectedValue);
}
if (ctrl is CheckBox)
{
Dictionary.Add(((CheckBox)ctrl).ID, ((CheckBox)ctrl).Checked);
}
}
}
catch (Exception ex)
{
}
}
#endregion
}
}
It is not going to extractvalue method at all.