Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Telerik RadScheduler-从服务器端获取所选范围?_C#_.net_Telerik_Server Side - Fatal编程技术网

C# Telerik RadScheduler-从服务器端获取所选范围?

C# Telerik RadScheduler-从服务器端获取所选范围?,c#,.net,telerik,server-side,C#,.net,Telerik,Server Side,当您在RadScheduler控件中选择一个时间范围并右键单击时,您将获得时间段上下文菜单-但当您从此菜单中选择一个项目时引发的事件只有一个时间段,其持续时间为您可以在当前视图中选择的最短时间段(周、日、月) 那么,如何在服务器端右键单击以获取选定的时间范围呢?不幸的是,当选定的时隙被发送到服务器端时,RadScheduler及其处理中似乎存在一个错误-正如您所注意到的,只发送了一个时隙。这记录在Telerik的公共问题跟踪程序中。这个漏洞已经存在了一段时间,可能还没有被解决,因为似乎很少有人关

当您在RadScheduler控件中选择一个时间范围并右键单击时,您将获得时间段上下文菜单-但当您从此菜单中选择一个项目时引发的事件只有一个时间段,其持续时间为您可以在当前视图中选择的最短时间段(周、日、月)


那么,如何在服务器端右键单击以获取选定的时间范围呢?

不幸的是,当选定的时隙被发送到服务器端时,RadScheduler及其处理中似乎存在一个错误-正如您所注意到的,只发送了一个时隙。这记录在Telerik的公共问题跟踪程序中。这个漏洞已经存在了一段时间,可能还没有被解决,因为似乎很少有人关心它——它只得到了三张选票,所以去投票吧

好消息是有一个解决办法。我在评论中提到了这一点,并认为我会进一步研究。当用户选择时隙范围、右键单击并触发客户端处理程序时,可以从客户端触发自定义Ajax请求

以下是aspx页面中的相关代码,其中包含RadScheduler控件的Javascript函数,用于OnClientTimeSlotContextMenuItemClicking事件。注意RadAjaxManager对象的OnAjaxRequest属性有一个自定义处理程序;这必须在codebehind中定义。此外,我发现有必要在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>

函数OnClientTimeSlotContextMenuItemClicking(发送方,参数){
var selectedSlots=sender.get_selectedSlots();
var firstSlotFromSelection=selectedSlots[0];
var lastSlotFromSelection=selectedSlots[selectedSlots.length-1];
var customArgs=“TimeSlotMenuItemClicked,”+firstSlotFromSelection.get_endTime()+“,”+
lastSlotFromSelection.get_endTime();
//为了测试的目的。。。
//警报(客户);
$find(“”).ajaxRequest(customArgs);
}
我对Javascript代码中的customArgs字段所做的是将服务器端需要的所有数据放在一起,因为只允许一个参数;解决方法是将我们需要的数据以某种合适的格式组装成一个对象,当它到达服务器方法时,我们可以成功地解析它。如果您感兴趣,Telerik会提到这种解决方法,但我在其他地方也见过这种技术

这是我在代码隐藏中使用的请求处理程序。我组合了一个单独的方法来解析字符串中的日期/时间,并获得正确的时区

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);
}
protectedvoid RadAjaxManager1\u AjaxRequest(对象发送方,AjaxRequestEventArgs e)
{
字符串[]argArray=e.Argument.Split(“,”.ToCharArray());
如果(argArray.Length>2&&argArray[0]=“TimeSlotMenuItemClicked”)
{
DateTime dtStart=GetDateTimeFromArgument(argArray[1]);
DateTime dtEnd=GetDateTimeFromArgument(argArray[2]);
//开始日期/时间是第一个时间段的结束;调整以到达开始处
TimeSpan tsSlotLength=新的TimeSpan(0,RadScheduler1.MinutesPerRow,0);
dtStart-=tsSlotLength;
//现在就开始/结束我们需要做的事情
}
}    
/// 
///日期/时间格式如下:“2013年4月6日星期六10:30:00 GMT-0700(美国山区标准时间)”
///将此字符串转换为日期。
/// 
/// 
/// 
private DateTime GetDateTimeFromArgument(字符串参数)
{
//提取时区限定符并将一个可以解析的字符串放在一起。
string formattedArg=string.Format(“{0}{1}:{2}”,
参数子串(0,24),参数子串(28,3),参数子串(31,2));
return DateTime.ParseExact(formattedArg,
“ddd MMM dd yyyy HH:mm:ss zzz”,
文化信息(不变量文化);
}
您看到了吗?推荐的方法是在客户端捕获所选范围的开始/结束,然后通过Ajax请求将它们传递给服务器。