作成日: 2018/04/11 最終更新日: 2018/08/24
文書種別
不具合
状況
修正済み
詳細
■事象
クライアントのシステム日付が29日~31日のとき、日付型セルの年月カレンダーで月を選択すると、選択した月の翌月が表示される場合があります。
発生条件:
・システム日付が29日のときに、うるう年でない2月を選択した場合
・システム日付が30日のときに、30日を持たない月(2月)を選択した場合
・システム日付が31日のときに、31日を持たない月(2月、4月、6月、9月、11月)を選択した場合
■サンプルコード(C#)
■再現手順
1.クライアントの実行マシンのシステム日付を3/31に変更します。
2.上記コードを実装したサンプルを実行し、2列目を編集モードにしてカレンダーを表示します。
3.カレンダーで「4月」を選択します。
結果:「201804」ではなく「201805」が表示されます。
なお、同じセルで再度カレンダーを表示し、「4月」を選択すると、正常に「201804」が表示されます。
クライアントのシステム日付が29日~31日のとき、日付型セルの年月カレンダーで月を選択すると、選択した月の翌月が表示される場合があります。
発生条件:
・システム日付が29日のときに、うるう年でない2月を選択した場合
・システム日付が30日のときに、30日を持たない月(2月)を選択した場合
・システム日付が31日のときに、31日を持たない月(2月、4月、6月、9月、11月)を選択した場合
■サンプルコード(C#)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Page.IsPostBack Then Return
Dim dateYMCellType As New FarPoint.Web.Spread.DateTimeCellType()
dateYMCellType.FormatString = "yyyy/MM"
dateYMCellType.EditMode.FormatString = "yyyyMM"
dateYMCellType.ShowPopupButton = True
dateYMCellType.DropDownControlStyleInfo.CalendarType = FarPoint.Web.Spread.CalendarType.YearMonth
FpSpread1.Sheets(0).Columns(1).Width = 120
FpSpread1.Sheets(0).Columns(1).CellType = dateYMCellType
End Sub
If Page.IsPostBack Then Return
Dim dateYMCellType As New FarPoint.Web.Spread.DateTimeCellType()
dateYMCellType.FormatString = "yyyy/MM"
dateYMCellType.EditMode.FormatString = "yyyyMM"
dateYMCellType.ShowPopupButton = True
dateYMCellType.DropDownControlStyleInfo.CalendarType = FarPoint.Web.Spread.CalendarType.YearMonth
FpSpread1.Sheets(0).Columns(1).Width = 120
FpSpread1.Sheets(0).Columns(1).CellType = dateYMCellType
End Sub
■再現手順
1.クライアントの実行マシンのシステム日付を3/31に変更します。
2.上記コードを実装したサンプルを実行し、2列目を編集モードにしてカレンダーを表示します。
3.カレンダーで「4月」を選択します。
結果:「201804」ではなく「201805」が表示されます。
なお、同じセルで再度カレンダーを表示し、「4月」を選択すると、正常に「201804」が表示されます。
回避方法
Service Pack 3(v10.0.4006.2013)で修正済み。
Service Pack 3より前のバージョンでは次の方法をご検討ください。
------------------------------------------
デフォルトの動作のまま本件を回避する方法はありません。
代替案としては、セルの編集開始時に現在の年月をデフォルト値として設定し、それを編集するような方法が考えられます。
具体的には、クライアントスクリプトのEditStartイベントを使用して、現在のセルに値を設定しています。
Service Pack 3より前のバージョンでは次の方法をご検討ください。
------------------------------------------
デフォルトの動作のまま本件を回避する方法はありません。
代替案としては、セルの編集開始時に現在の年月をデフォルト値として設定し、それを編集するような方法が考えられます。
具体的には、クライアントスクリプトのEditStartイベントを使用して、現在のセルに値を設定しています。
<script type="text/javascript">
document.onreadystatechange = function () {
if (document.readyState == "complete") {
var spread = document.getElementById("FpSpread1");
if (document.all) {
if (spread.addEventListener) {
spread.addEventListener("EditStart", OnEditStart, false);
}
else {
spread.onEditStart = OnEditStart;
}
}
else {
spread.addEventListener("EditStart", OnEditStart, false);
}
}
}
function OnEditStart(e) {
var spread = e.spread;
var cell = e.cell;
if (cell.getAttribute("celltype2") == "DateTimeCellType") {
var ctController = FarPoint.Web.Spread.CellTypeFactory.GetCellType(spread, cell);
if (ctController && ctController.editor && ctController.editor.ddControlId) {
var calendarType = document.getElementById(ctController.editor.ddControlId).getAttribute("IMCalendarType");
if (calendarType && calendarType == "YearMonth") {
var value = ctController.GetValue();
if ((value == null || value == "") && ctController.editor.SetValue) {
var tmpDate = new Date();
spread.SetValue(spread.ActiveRow, spread.ActiveCol, tmpDate.getFullYear() + "/" + (tmpDate.getMonth() + 1), false);
}
}
}
}
}
</script>
document.onreadystatechange = function () {
if (document.readyState == "complete") {
var spread = document.getElementById("FpSpread1");
if (document.all) {
if (spread.addEventListener) {
spread.addEventListener("EditStart", OnEditStart, false);
}
else {
spread.onEditStart = OnEditStart;
}
}
else {
spread.addEventListener("EditStart", OnEditStart, false);
}
}
}
function OnEditStart(e) {
var spread = e.spread;
var cell = e.cell;
if (cell.getAttribute("celltype2") == "DateTimeCellType") {
var ctController = FarPoint.Web.Spread.CellTypeFactory.GetCellType(spread, cell);
if (ctController && ctController.editor && ctController.editor.ddControlId) {
var calendarType = document.getElementById(ctController.editor.ddControlId).getAttribute("IMCalendarType");
if (calendarType && calendarType == "YearMonth") {
var value = ctController.GetValue();
if ((value == null || value == "") && ctController.editor.SetValue) {
var tmpDate = new Date();
spread.SetValue(spread.ActiveRow, spread.ActiveCol, tmpDate.getFullYear() + "/" + (tmpDate.getMonth() + 1), false);
}
}
}
}
}
</script>
旧文書番号
41745