当您在RadScheduler控件中选择一个时间范围并右键单击时,您将获得TimeSlot上下文菜单 - 但是从此菜单中选择项目时引发的事件只有一个时间段,其持续时间最短为您可以在当前视图中选择的时间(周,日,月)。
那么如何在服务器端右键单击所选时间范围?
答案 0 :(得分:2)
不幸的是,RadScheduler中出现了一个错误,当它们被发送到服务器端时它处理选定的时隙 - 正如您所注意到的那样,只发送了一个时隙。这在Telerik的公共问题跟踪器here中有记录。这个bug已经存在了一段时间,可能尚未解决,因为很少有人关心 - 它只得到三票,所以到那里投票。
好消息是有一个解决方法。我在评论中提到过它,并认为我会进一步研究。当用户选择时隙范围,右键单击并触发客户端处理程序时,您可以从客户端触发自定义Ajax请求。
这是您的aspx页面中的相关代码,其中包含用于OnClientTimeSlotContextMenuItemClicking事件的RadScheduler控件的Javascript函数。请注意,RadAjaxManager对象的OnAjaxRequest属性具有自定义处理程序;这必须在代码隐藏中定义。此外,我发现有必要在RadCodeBlock中包含Javascript,因为该函数正在访问RadAjaxManager对象。
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"
OnAjaxRequest="RadAjaxManager1_AjaxRequest">
</telerik:RadAjaxManager>
<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server">
<script type="text/javascript">
function OnClientTimeSlotContextMenuItemClicking(sender, args) {
var selectedSlots = sender.get_selectedSlots();
var firstSlotFromSelection = selectedSlots[0];
var lastSlotFromSelection = selectedSlots[selectedSlots.length - 1];
var customArgs = "TimeSlotMenuItemClicked," + firstSlotFromSelection.get_endTime() + "," +
lastSlotFromSelection.get_endTime();
// for testing purposes...
// alert(customArgs);
$find("<%= RadAjaxManager1.ClientID %>").ajaxRequest(customArgs);
}
</script>
</telerik:RadCodeBlock>
我正在使用Javascript代码中的 customArgs 字段,将服务器端所需的所有数据放在一起,因为只允许一个参数;解决方法是将我们需要的数据以某种合适的格式组合到对象中,当它到达服务器方法时我们可以成功解析。如果你有兴趣,Telerik会提到这个解决方法here,但我也在其他地方看过这种技巧。
这是我在代码隐藏中使用的OnAjaxRequest处理程序。我整理了一个单独的方法来解析字符串中的日期/时间并获得正确的时区。
protected void RadAjaxManager1_AjaxRequest(object sender, AjaxRequestEventArgs e)
{
String[] argArray = e.Argument.Split(",".ToCharArray());
if (argArray.Length > 2 && argArray[0] == "TimeSlotMenuItemClicked")
{
DateTime dtStart = GetDateTimeFromArgument(argArray[1]);
DateTime dtEnd = GetDateTimeFromArgument(argArray[2]);
// Starting date/time is the end of the first timeslot; adjust to arrive at the beginning
TimeSpan tsSlotLength = new TimeSpan(0, RadScheduler1.MinutesPerRow, 0);
dtStart -= tsSlotLength;
// Do what we need to do with the start/end now
}
}
/// <summary>
/// Date/Time format will look like this: "Sat Apr 06 2013 10:30:00 GMT-0700 (US Mountain Standard Time)"
/// Turn this from a string into a date.
/// </summary>
/// <param name="arg"></param>
/// <returns></returns>
private DateTime GetDateTimeFromArgument(string arg)
{
// Extract the timezone qualifier and put together a string we can parse.
string formattedArg = string.Format("{0} {1}:{2}",
arg.Substring(0, 24), arg.Substring(28, 3), arg.Substring(31, 2));
return DateTime.ParseExact(formattedArg,
"ddd MMM dd yyyy HH:mm:ss zzz",
CultureInfo.InvariantCulture);
}