RadSchedulerコントロールで時間の範囲を選択して右クリックすると、TimeSlotコンテキストメニューが表示されますが、このメニューから項目を選択したときに発生するイベントには、期間が最も短い1つのタイムスロットしかありません。現在のビュー(週、日、月)で選択できます。
では、サーバーサイドを右クリックして、選択した時間範囲を取得するにはどうすればよいですか?
RadSchedulerコントロールで時間の範囲を選択して右クリックすると、TimeSlotコンテキストメニューが表示されますが、このメニューから項目を選択したときに発生するイベントには、期間が最も短い1つのタイムスロットしかありません。現在のビュー(週、日、月)で選択できます。
では、サーバーサイドを右クリックして、選択した時間範囲を取得するにはどうすればよいですか?
残念ながら、RadSchedulerと、選択したタイムスロットがサーバー側に送信されるときの処理にバグがあるようです。お気づきのとおり、タイムスロットの1つだけが送信されます。これは、TelerikのPublicIssueTrackerに記載されています。バグはしばらく前からあり、気にかけている人が非常に少ないため、おそらくまだ対処されていません。3票しか得られていないので、そこに行って投票してください。
良いニュースは、回避策があるということです。私はコメントでそれについて言及し、さらに調べてみようと思いました。ユーザーがタイムスロットの範囲を選択して右クリックし、クライアント側ハンドラーをトリガーすると、クライアント側からカスタムAjaxリクエストをトリガーできます。
これがaspxページの関連コードであり、RadSchedulerコントロールのJavascript関数がOnClientTimeSlotContextMenuItemClickingイベントに使用されます。RadAjaxManagerオブジェクトには、OnAjaxRequestプロパティのカスタムハンドラーがあることに注意してください。これは、コードビハインドで定義する必要があります。また、関数がRadAjaxManagerオブジェクトにアクセスしているため、RadCodeBlock内にJavascriptを含める必要があることがわかりました。
<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フィールドで行っているのは、許可される引数が1つしかないため、サーバー側で必要なすべてのデータをまとめることです。この回避策は、必要なデータを適切な形式のオブジェクトにアセンブルし、サーバーメソッドに到着したときに正常に解析できるようにすることです。Telerikは、興味があればこの回避策についてここで言及していますが、他の場所でもこの種の手法を見てきました。
これが、コードビハインドで使用した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);
}