I have a radgrid control (with detail tables) on an aspx page . I have button column on the parent and the child(detail
tables) as well.
Based on some criteria I have to disable/enable the button column on parent and/or the child.
what is the best way to do it?
To explain further, the parent display the order and when click on the order it shows the order items for the order.
the button column is to duplicate an order. the button on the parent duplicates the whole order. the button on the child
(order items) duplicates an order with that particular order item.
Please advise the best solution,
Thanks
[NullReferenceException: Object reference not set to an instance of an object.] Telerik.Web.UI.TreeListItemDecorator.PrepareDataItemsServiceCells(RadTreeList owner) +534 Telerik.Web.UI.RadTreeList.PrepareRows() +215 Telerik.Web.UI.RadTreeList.Render(HtmlTextWriter writer) +29 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 System.Web.UI.Control.Render(HtmlTextWriter writer) +10 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 System.Web.DynamicData.DynamicControl.Render(HtmlTextWriter writer) +154 ...
Here is the code:
<%@ Control Language="C#" CodeBehind="ManyToMany_Edit.ascx.cs" Inherits="Ctp.U.Web.ResidentPortal.Forms.ManyToMany_EditField" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<
telerik:RadTreeList
ID
=
"_radTreeList1"
runat
=
"server"
OnDataBound
=
"_radTreeList1_DataBound"
>
</
telerik:RadTreeList
>
using
System;
using
System.Collections;
using
System.ComponentModel;
using
System.Data.Objects;
using
System.Data.Objects.DataClasses;
using
System.Web.DynamicData;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
Telerik.Web.UI;
namespace
Ctp.U.Web.ResidentPortal.Forms
{
public
partial
class
ManyToMany_EditField : System.Web.DynamicData.FieldTemplateUserControl
{
public
void
Page_Load(
object
sender, EventArgs e)
{
// Register for the DataSource's updating event
EntityDataSource ds = (EntityDataSource)
this
.FindDataSourceControl();
// This field template is used both for Editing and Inserting
ds.Updating +=
new
EventHandler<EntityDataSourceChangingEventArgs>(DataSource_UpdatingOrInserting);
ds.Inserting +=
new
EventHandler<EntityDataSourceChangingEventArgs>(DataSource_UpdatingOrInserting);
}
void
DataSource_UpdatingOrInserting(
object
sender, EntityDataSourceChangingEventArgs e)
{
MetaTable childTable = ChildrenColumn.ChildTable;
// Comments assume employee/territory for illustration, but the code is generic
// Get the collection of territories for this employee
RelatedEnd entityCollection = (RelatedEnd)Column.EntityTypeProperty.GetValue(e.Entity,
null
);
// In Edit mode, make sure it's loaded (doesn't make sense in Insert mode)
if
(Mode == DataBoundControlMode.Edit && !entityCollection.IsLoaded)
{
entityCollection.Load();
}
// Get an IList from it (i.e. the list of territories for the current employee)
// REVIEW: we should be using EntityCollection directly, but EF doesn't have a
// non generic type for it. They will add this in vnext
IList entityList = ((IListSource)entityCollection).GetList();
// Go through all the territories (not just those for this employee)
foreach
(
object
childEntity
in
childTable.GetQuery(e.Context))
{
// Check if the employee currently has this territory
bool
isCurrentlyInList = entityList.Contains(childEntity);
// Find the checkbox for this territory, which gives us the new state
string
pkString = childTable.GetPrimaryKeyString(childEntity);
//ListItem listItem = CheckBoxList1.Items.FindByValue(pkString);
TreeListDataItem radItem =
null
;
foreach
(TreeListDataItem item
in
_radTreeList1.Items)
{
if
(item[
"Id"
].Text == pkString)
radItem = item;
}
if
(radItem ==
null
)
continue
;
// If the states differs, make the appropriate add/remove change
if
(radItem.Selected)
{
if
(!isCurrentlyInList)
entityList.Add(childEntity);
}
else
{
if
(isCurrentlyInList)
entityList.Remove(childEntity);
}
}
}
protected
void
DataBound()
{
MetaTable childTable = ChildrenColumn.ChildTable;
// Comments assume employee/territory for illustration, but the code is generic
IList entityList =
null
;
ObjectContext objectContext =
null
;
if
(Mode == DataBoundControlMode.Edit)
{
object
entity;
ICustomTypeDescriptor rowDescriptor = Row
as
ICustomTypeDescriptor;
if
(rowDescriptor !=
null
)
{
// Get the real entity from the wrapper
entity = rowDescriptor.GetPropertyOwner(
null
);
}
else
{
entity = Row;
}
// Get the collection of territories for this employee and make sure it's loaded
RelatedEnd entityCollection = Column.EntityTypeProperty.GetValue(entity,
null
)
as
RelatedEnd;
if
(entityCollection ==
null
)
{
throw
new
InvalidOperationException(String.Format(
"The ManyToMany template does not support the collection type of the '{0}' column on the '{1}' table."
, Column.Name, Table.Name));
}
if
(!entityCollection.IsLoaded)
{
entityCollection.Load();
}
// Get an IList from it (i.e. the list of territories for the current employee)
// REVIEW: we should be using EntityCollection directly, but EF doesn't have a
// non generic type for it. They will add this in vnext
entityList = ((IListSource)entityCollection).GetList();
// Get the current ObjectContext
// REVIEW: this is quite a dirty way of doing this. Look for better alternative
ObjectQuery objectQuery = (ObjectQuery)entityCollection.GetType().GetMethod(
"CreateSourceQuery"
).Invoke(entityCollection,
null
);
objectContext = objectQuery.Context;
}
// Go through all the territories (not just those for this employee)
foreach
(
object
childEntity
in
childTable.GetQuery(objectContext))
{
_radTreeList1.DataKeyNames =
new
string
[] {
"Id"
};
_radTreeList1.ParentDataKeyNames =
new
string
[] {
"ParentId"
};
TreeListDataItem radItem =
new
TreeListDataItem(_radTreeList1
, TreeListItemType.Item
, _radTreeList1.Items.Count
,
true
);
radItem.DataItem = childEntity;
// Make it selected if the current employee has that territory
if
(Mode == DataBoundControlMode.Edit)
{
radItem.Selected = entityList.Contains(childEntity);
}
_radTreeList1.Items.Add(radItem);
}
}
protected
void
_radTreeList1_DataBound(
object
sender, EventArgs e)
{
DataBound();
}
public
override
Control DataControl
{
get
{
return
_radTreeList1;
}
}
}
}
<
radA:RadAjaxManager
ID
=
"RadAjaxManager1"
runat
=
"server"
>
<
AjaxSettings
>
<
radA:AjaxSetting
AjaxControlID
=
"dgproductGroups"
>
<
UpdatedControls
>
<
radA:AjaxUpdatedControl
ControlID
=
"dgProducts"
LoadingPanelID
=
"loadProducts"
/>
<
radA:AjaxUpdatedControl
ControlID
=
"dgFileList"
LoadingPanelID
=
"loadFileDetails"
/>
</
UpdatedControls
>
</
radA:AjaxSetting
>
<
radA:AjaxSetting
AjaxControlID
=
"dgProducts"
>
<
UpdatedControls
>
<
radA:AjaxUpdatedControl
ControlID
=
"dgFileList"
LoadingPanelID
=
"loadFileDetails"
/>
</
UpdatedControls
>
</
radA:AjaxSetting
>
<
radA:AjaxSetting
AjaxControlID
=
"dgFileList"
>
<
UpdatedControls
>
<
radA:AjaxUpdatedControl
ControlID
=
"dgFileList"
LoadingPanelID
=
"loadFileDetails"
/>
</
UpdatedControls
>
</
radA:AjaxSetting
>
<
radA:AjaxSetting
AjaxControlID
=
"btnShowObsolete"
>
<
UpdatedControls
>
<
radA:AjaxUpdatedControl
ControlID
=
"dgFileList"
LoadingPanelID
=
"loadFileDetails"
/>
</
UpdatedControls
>
</
radA:AjaxSetting
>
<
radA:AjaxSetting
AjaxControlID
=
"btnObsolete"
>
<
UpdatedControls
>
<
radA:AjaxUpdatedControl
ControlID
=
"dgFileList"
LoadingPanelID
=
"loadFileDetails"
/>
</
UpdatedControls
>
</
radA:AjaxSetting
>
</
AjaxSettings
>
<
ClientEvents
OnResponseReceived
=
"OnAjaxDataReceived"
OnRequestStart
=
"OnAjaxDataSentStart"
/>
</
radA:RadAjaxManager
>
<
radA:AjaxLoadingPanel
id
=
"loadProducts"
style
=
"width:320px;padding-top:30px;"
runat
=
"server"
>
<
asp:Image
ID
=
"Image2"
ImageUrl
=
"~/RadControls/AJAX/Skins/Default/MSN_Blue.gif"
AlternateText
=
"Loading"
BorderWidth
=
"0px"
Runat
=
"server"
>
</
asp:Image
>
</
rada:AjaxLoadingPanel
>
<
radA:AjaxLoadingPanel
id
=
"loadFileDetails"
style
=
"width:320px;padding-top:130px;"
runat
=
"server"
>
<
asp:Image
ID
=
"Image3"
ImageUrl
=
"~/RadControls/AJAX/Skins/Default/MSN_Blue.gif"
AlternateText
=
"Loading"
BorderWidth
=
"0px"
Runat
=
"server"
>
</
asp:Image
>
</
rada:AjaxLoadingPanel
>
function OnAjaxDataReceived()
{
if(dgProductsDisabled = true)
{
EnableGrid('ctl00_CntPlHolder_dgProducts');
dgProductsDisabled = false;
}
EnableGrid('ctl00_CntPlHolder_dgproductGroups');
}
function OnAjaxDataSentStart()
{
//PRODUCTS DATAGRID WILL NOT BE DISABLED WHEN THE PRODUCT GROUPS GRID's ROW IS SELECTED
if(dgProductsDisabled = true)
{
DisableGrid('ctl00_CntPlHolder_dgProducts');
}
//DISABLING THE PRODUCT GROUPS DATAGRID UNTIL THE DATA IS RECIEVED FROM THE SERVER THROUGH RAD AJAX
DisableGrid('ctl00_CntPlHolder_dgproductGroups');
}
function EnableGrid(gridClientID)
{
window[gridClientID].AjaxRequest("dgproductGroups", "");
}
function DisableGrid(gridClientID)
{
try
{
gridCtrl = window[gridClientID];
gridCtrl.Control.disabled = "disabled";
gridCtrl.ClientSettings.Selecting.AllowRowSelect = false;
gridCtrl.ClientSettings.Resizing.AllowColumnResize = false;
gridCtrl.ClientSettings.Resizing.AllowRowResize = false;
gridCtrl.ClientSettings.AllowColumnsReorder = false;
gridCtrl.ClientSettings.AllowDragToGroup = false;
gridCtrl.ClientSettings.EnablePostBackOnRowClick = false;
var links = gridCtrl.Control.getElementsByTagName("a");
var images = gridCtrl.Control.getElementsByTagName("img");
var inputs = gridCtrl.Control.getElementsByTagName("input");
var sortButtons = gridCtrl.Control.getElementsByTagName("span");
for(var i = 0; i < links.length; i++)
{
links[i].href = "";
links[i].onclick = function()
{
return false;
}
}
for(var i = 0; i < images.length; i++)
{
images[i].onclick = function()
{
return false;
}
}
for(var i = 0; i < sortButtons.length; i++)
{
sortButtons[i].onclick = function()
{
return false;
}
}
for(var i = 0; i < inputs.length; i++)
{
switch(inputs[i]. type)
{
case "button":
inputs[i].onclick = function()
{
return false;
}
break;
case "checkbox":
inputs[i].disabled = "disabled";
break;
case "radio":
inputs[i].disabled = "disabled";
break;
case "text":
inputs[i].disabled = "disabled";
break;
case "password":
inputs[i].disabled = "disabled";
break;
case "image":
inputs[i].onclick = function()
{
return false;
}
break;
case "file":
inputs[i].disabled = "disabled";
break;
default:
break;
}
}
var scrollArea = document.getElementById(gridCtrl.ClientID + "_GridData");
if(scrollArea)
{
scrollArea.disabled = "disabled";
}
}
catch(e)
{
alert(e);
}
}
function isRoomOccupied(scheduler, start, end, slot, appointment)
{
//get the "Room" resource associated with the time slot
var currentRoom = slot.get_resource();
//get all appointments for this "room" in the specified period
var appointmentsForThisRoom = getAppointmentsInRangeByResource(scheduler, start, end, currentRoom, appointment);
//if the list of appointments is not empty there are other appointments in this slot
return appointmentsForThisRoom.get_count() > 0;
}
I am not sure what I am doing wrong. Thanks.
function isRoomOccupied(scheduler, start, end, slot, appointment)
{
//get the "Room" resource associated with the time slot
var currentRoom = slot.get_resource();
//get all appointments for this "room" in the specified period
var appointmentsForThisRoom = getAppointmentsInRangeByResource(scheduler, start, end, currentRoom, appointment);
//if the list of appointments is not empty there are other appointments in this slot
return appointmentsForThisRoom.get_count() > 0;
}
function warnIfOccupied(start, end, sender, args)
{
var slot = args.get_targetSlot();
var appointment = args.get_appointment();
if (isRoomOccupied(sender, start, end, slot, appointment))
{
alert(
"This room is not available in this time period.");
args.set_cancel(
true);
}
appointment.get_element().style.border =
"";
}
function onAppointmentResizeEnd(sender, args)
{
var start = args.get_appointment().get_start();
var end = args.get_targetSlot().get_endTime();
warnIfOccupied(start, end, sender, args);
}
function onAppointmentMoveEnd(sender, args)
{
var start = args.get_targetSlot().get_startTime();
var end = new Date(start.getTime() + args.get_appointment().get_duration());
warnIfOccupied(start, end, sender, args);
}
function onAppointmentInserting(sender, args)
{
var slot = args.get_targetSlot();
var start = slot.get_startTime();
var end = slot.get_endTime();
if (isRoomOccupied(sender, start, end, slot))
{
alert(
"This room is not available in this time period.");
args.set_cancel(
true);
}
}
<
telerik:RadScheduler runat="server" ID="RadScheduler1" OnClientAppointmentEditing="AppointmentEditing"
OnClientAppointmentInserting="AppointmentInserting" EnableCustomAttributeEditing="true"
SelectedDate="2009-07-26" DataSourceID="EventsDataSource" DataKeyField="MeetingID"
DataSubjectField="Description" DataStartField="Start" DataEndField="End" SelectedView="WeekView"
FirstDayOfWeek="Sunday" LastDayOfWeek="Saturday" Skin="Vista" ShowResourceHeaders="false"
CustomAttributeNames="Description,HostedBy,Room" Height="100%" Localization-ConfirmDeleteText="Are you sure you want to delete this meeting?"
TimelineView-UserSelectable="false" OnClientAppointmentMoveEnd="onAppointmentMoveEnd"
OnClientAppointmentResizeEnd="onAppointmentResizeEnd">
<ResourceTypes>
<telerik:ResourceType KeyField="Room" Name="Room" TextField="Room" ForeignKeyField="Room"
DataSourceID="RoomsDataSource" />
</ResourceTypes>
<AppointmentTemplate>
<div style="color: Maroon;">
<%
#Eval("Description")%></div>
<%
-- <br />--%>
<div style="color: Teal;">
</font>Host: <%#Eval("HostedBy")%></div>
<%
-- <br />--%>
<div style="color: Fuchsia;">
Room:
<%#Eval("Room")%></div>
</AppointmentTemplate>
</telerik:RadScheduler>
<asp:Button ID="btnGo" runat="server" Text="Go" Visible="false" />
<asp:SqlDataSource ID="SqlDataSource1" runat="server"></asp:SqlDataSource>
<asp:SqlDataSource ID="EventsDataSource" runat="server" ProviderName="System.Data.SqlClient"
ConnectionString="<%$ ConnectionStrings:MCHPEVENTS %>" SelectCommand="SELECT [MeetingID], [Description], [Start], [End], [Room], [HostedBy], [Food], [Beverages], [Projector], [Easel], [Flipchart], [Microphone], [HotelAVSupplies], [Comments] FROM [Meetings]"
InsertCommand="INSERT INTO [Meetings] ([Description], [Start], [End], [Room]) VALUES (@Description, @Start, @End, @Room)"
UpdateCommand="UPDATE [Meetings] SET [Description] = @Description, [Start] = @Start, [End] = @End, [Room] = @Room WHERE (MeetingID = @MeetingID)"
DeleteCommand="DELETE FROM [Meetings] WHERE [MeetingID] = @MeetingID">
<DeleteParameters>
<asp:Parameter Name="MeetingID" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="MeetingID" Type="Int32" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="Start" Type="DateTime" />
<asp:Parameter Name="End" Type="DateTime" />
<asp:Parameter Name="Room" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="Start" Type="DateTime" />
<asp:Parameter Name="End" Type="DateTime" />
<asp:Parameter Name="Room" Type="String" DefaultValue="TBD" />
</InsertParameters>
</asp:SqlDataSource>
<asp:SqlDataSource ID="RoomsDataSource" runat="server" ProviderName="System.Data.SqlClient"
ConnectionString="<%$ ConnectionStrings:MCHPEVENTS %>" SelectCommand="SELECT DISTINCT([Room]) FROM [Meetings]">
</asp:SqlDataSource>