I need to set the GridBound column to read-only when in edit mode but editable when in insert mode (New row added). I've attempted using the Code-Behind "ItemDataBound" event as well as Client-Side "OnBatchEditOpend" event to set the read-only property on the column. Neither attempt work as the column always allows text to be entered. Below are my code snippets:
Thank you in advance for any help you can provide.
Grid Markup:
<telerik:RadAjaxLoadingPanel ID="CatLoadingPanel1" runat="server"></telerik:RadAjaxLoadingPanel>
<telerik:RadAjaxPanel ID="CatPanel1" runat="server" LoadingPanelID="CatLoadingPanel1">
<telerik:RadGrid ID="grdCategory" runat="server" AutoGenerateColumns="false" CssClass="Gridheight4"
Width="100%" AllowPaging="true" PageSize="10">
<ClientSettings>
<Scrolling AllowScroll="true" UseStaticHeaders="true" />
<KeyboardNavigationSettings AllowSubmitOnEnter="true" />
<ClientEvents OnBatchEditGetCellValue="GetCellValue" />
<ClientEvents OnBatchEditSetCellValue="SetCellValue" />
<ClientEvents OnBatchEditGetEditorValue="GetEditorValue" />
<ClientEvents OnBatchEditSetEditorValue="SetEditorValue" />
<ClientEvents OnBatchEditOpened="BatchEditOpened" />
</ClientSettings>
<MasterTableView DataKeyNames="Category" EditMode="Batch" HeaderStyle-Font-Size="8pt"
HeaderStyle-Font-Bold="true" ItemStyle-Font-Size="8pt" PagerStyle-AlwaysVisible="true"
CommandItemDisplay="Top" InsertItemDisplay="Top" BatchEditingSettings-EditType="Cell"
BatchEditingSettings-OpenEditingEvent="Click">
<CommandItemSettings ShowSaveChangesButton="true" ShowCancelChangesButton="true"
ShowRefreshButton="true"/>
<Columns>
<telerik:GridBoundColumn DataField="Category" UniqueName="Category" HeaderText="Category"
DataType="System.String" ItemStyle-CssClass="maximize" HeaderStyle-Width="250px" ItemStyle-
Font-Size="8pt">
</telerik:GridBoundColumn>
<telerik:GridTemplateColumn DataField="Is_Active" UniqueName="Is_Active" HeaderText="Active"
HeaderStyle-Width="80px">
<ItemTemplate>
<telerik:RadSwitch runat="server" ID="CheckBox1" AutoPostBack="true" Enabled="false"
CssClass="elasticSwitch" Checked='<%# Eval("Is_Active") %>' OnClientClicking="checkbox1Click">
</telerik:RadSwitch>
</ItemTemplate>
<EditItemTemplate>
<telerik:RadSwitch runat="server" ID="CheckBox2" AutoPostBack="false"
CssClass="elasticSwitch">
</telerik:RadSwitch>
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridCheckBoxColumn DataField="CCD_Only" UniqueName="CCD_Only" HeaderText="CCD Only"
HeaderTooltip="Show for CCD UMs Only.." DataType="System.Boolean">
</telerik:GridCheckBoxColumn>
<telerik:GridCheckBoxColumn DataField="MMS_Only" UniqueName="MMS_Only" HeaderText="MMS Only"
HeaderTooltip="Medication Management UMs Only.." DataType="System.Boolean">
</telerik:GridCheckBoxColumn>
<telerik:GridBoundColumn DataField="Comments" UniqueName="Comments"
HeaderText="Comments" DataType="System.String"></telerik:GridBoundColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
</telerik:RadAjaxPanel>
Client Script
<script type="text/javascript">
function GetCellValue(sender, args) {
if (args.get_columnUniqueName() == "Is_Active") {
args.set_cancel(true);
var container = args.get_container();
var displaySwitch = $telerik.findControl(container, "CheckBox1");
if (displaySwitch) {
args.set_value(displaySwitch.get_checked());
}
}
}
function SetCellValue(sender, args) {
if (args.get_columnUniqueName() == "Is_Active") {
args.set_cancel(true);
var container = args.get_container();
var displaySwitch = $telerik.findControl(container, "CheckBox1");
if (displaySwitch) {
displaySwitch.set_checked(args.get_value());
}
}
}
function GetEditorValue(sender, args) {
if (args.get_columnUniqueName() == "Is_Active") {
args.set_cancel(true);
var container = args.get_container();
var editorSwitch = $telerik.findControl(container, "CheckBox2");
if (editorSwitch) {
args.set_value(editorSwitch.get_checked());
}
}
}
function SetEditorValue(sender, args) {
if (args.get_columnUniqueName() == "Is_Active") {
args.set_cancel(true);
var container = args.get_container();
var editorSwitch = $telerik.findControl(container, "CheckBox2");
if (editorSwitch) {
editorSwitch.set_checked(args.get_value());
}
}
}
function BatchEditOpened(sender, args) {
var tblView = args.get_tableView();
var dataIem = tblView.get_dataItems();
var item = args.get_row().control;
var index = item.get_itemIndex();
var colCategory = tblView.getColumnByUniqueName("Category");
var colelement = colCategory.get_element();
if (index < 0) {
colelement.setAttribute("readonly", false);
}
else {
colelement.setAttribute("readonly", true);
}
}
function checkbox1Click(sender, args) {
args.set_cancel(true);
var grid = $find("<%= grdCategory.ClientID %>");
var batchEditingManager = grid.get_batchEditingManager();
var parentCell = $telerik.$(sender.get_element()).closest("td")[0];
var initialValue = sender.get_checked();
batchEditingManager.changeCellValue(parentCell, initialValue);
}
</script>
VB Code Behind
Private Sub grdCategory_ItemDataBound(sender As Object, e As GridItemEventArgs) Handles grdCategory.ItemDataBound
If TypeOf e.Item Is GridEditableItem Then
If e.Item.IsInEditMode Then
Dim itemIndex As Integer = e.Item.ItemIndex
Dim CateGoryColumn As GridColumn = grdCategory.MasterTableView.GetColumn("Category")
If itemIndex < 0 Then
CType(CateGoryColumn, GridEditableColumn).ReadOnly = False
Else
CType(CateGoryColumn, GridEditableColumn).ReadOnly = False
End If
End If
End If
End Sub
Thank you for your comment, Georgia,
Do you have an example of how to set the column to read-only using the Client-Side event. As in the code snippets provided, I've attempted this using the "BatchEditOPened" event. There doesn't seem to be a Client-Side set read-only method on the grid column. As you can see, I tried on the column element instead.