作成日: 2017/12/26 最終更新日: 2018/06/29
文書種別
技術情報
詳細
Windows 10にFall Creators Updateを適用すると、以下のWindowsフォーム用コンポーネントで、セルが非編集の状態から直接キー押下で文字を入力する際の動作が不正になる現象が確認されています。
発生する現象
例えば以下のような現象が発生します。
原因
本現象は、以下のMicrosoft社の情報のとおり、Fall Creators Updateが原因で発生しています。文字入力によってセルが非編集状態から編集状態に切り替わる際の入力確定のタイミングが不正になるため発生します。
回避策
キー関連イベントや常時入力モードを利用して、文字入力が開始する前に強制的にセルを編集状態にすることで回避できます。以下の各製品の回避コードを参考に対応をご検討ください。
【SPREAD for Windows Forms】
◎サンプルコード(VB)
◎サンプルコード(C#)
【MultiRow for Windows Forms】
◎サンプルコード(VB)
◎サンプルコード(C#)
【CalendarGrid for Windows Forms】
◎サンプルコード(VB)
◎サンプルコード(C#)
【FlexGrid for WinForms(ComponentOne Studio)】
・回避策(1)
文字入力が開始する前に強制的にセルを編集状態にします。
◎サンプルコード(VB)
◎サンプルコード(C#)
・回避策(2)
Windows 10 April 2018 Update (v1803) にバージョンアップする共に、アプリケーション側で、FormのOnShownメソッドをオーバーライドし、疑似的に最初の編集を終えた状態にするための以下のようなコードを追加します。
※これは、FlexGrid上で動くIME/TSF側に対して初期化の機会を与える変更を行うためです。
◎サンプルコード(VB)
◎サンプルコード(C#)
【True DBGrid for WinForms(ComponentOne Studio)】
◎サンプルコード(VB)
◎サンプルコード(C#)
なお、以上の回避策は各製品の最新バージョンを使用して確認しています。各製品の旧バージョンの場合は、上記コードを参考に対応をご検討ください。
- SPREAD for Windows Forms
- MultiRow for Windows Forms
- CalendarGrid for Windows Forms
- FlexGrid for WinForms(ComponentOne Studio)
- True DBGrid for WinForms(ComponentOne Studio)
発生する現象
例えば以下のような現象が発生します。
- IMEをオンにして日本語入力にしているとき、非編集状態のセルで「k」「a」とキーボード入力すると、編集状態になったセルで「か」ではなく「kあ」または「kkあ」と入力される(kは確定状態、あ以降が未確定状態)
- IMEをオンにして日本語入力にしているとき、非編集状態のセルで「k」とキーボード入力すると、セルが編集状態になるが、「k」が入力されない
原因
本現象は、以下のMicrosoft社の情報のとおり、Fall Creators Updateが原因で発生しています。文字入力によってセルが非編集状態から編集状態に切り替わる際の入力確定のタイミングが不正になるため発生します。
Fall Creators Update を適用後 DataGridView に文字を入力すると 2 文字入力される
なお、本現象は標準のDataGridViewでも発生します。回避策
キー関連イベントや常時入力モードを利用して、文字入力が開始する前に強制的にセルを編集状態にすることで回避できます。以下の各製品の回避コードを参考に対応をご検討ください。
【SPREAD for Windows Forms】
◎サンプルコード(VB)
' PreviewKeyDownイベントでセルを編集状態にする
Private Sub fpSpread1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles fpSpread1.PreviewKeyDown
If Not fpSpread1.EditMode AndAlso e.KeyCode = Keys.ProcessKey Then fpSpread1.EditMode = True
End Sub
Private Sub fpSpread1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles fpSpread1.PreviewKeyDown
If Not fpSpread1.EditMode AndAlso e.KeyCode = Keys.ProcessKey Then fpSpread1.EditMode = True
End Sub
◎サンプルコード(C#)
// PreviewKeyDownイベントでセルを編集状態にする
private void fpSpread1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (!fpSpread1.EditMode && e.KeyCode == Keys.ProcessKey)
{
fpSpread1.EditMode = true;
}
}
private void fpSpread1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (!fpSpread1.EditMode && e.KeyCode == Keys.ProcessKey)
{
fpSpread1.EditMode = true;
}
}
【MultiRow for Windows Forms】
◎サンプルコード(VB)
' PreviewKeyDownイベントでセルを編集状態にする
Private Sub GcMultiRow1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles GcMultiRow1.PreviewKeyDown
If Not GcMultiRow1.IsCurrentCellInEditMode AndAlso e.KeyCode = Keys.ProcessKey Then GcMultiRow1.BeginEdit(False)
End Sub
Private Sub GcMultiRow1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles GcMultiRow1.PreviewKeyDown
If Not GcMultiRow1.IsCurrentCellInEditMode AndAlso e.KeyCode = Keys.ProcessKey Then GcMultiRow1.BeginEdit(False)
End Sub
◎サンプルコード(C#)
// PreviewKeyDownイベントでセルを編集状態にする
private void gcMultiRow1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (!gcMultiRow1.IsCurrentCellInEditMode && e.KeyCode == Keys.ProcessKey)
{
gcMultiRow1.BeginEdit(false);
}
}
private void gcMultiRow1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (!gcMultiRow1.IsCurrentCellInEditMode && e.KeyCode == Keys.ProcessKey)
{
gcMultiRow1.BeginEdit(false);
}
}
【CalendarGrid for Windows Forms】
◎サンプルコード(VB)
' PreviewKeyDownイベントでセルを編集状態にする
Private Sub GcCalendarGrid1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles GcCalendarGrid1.PreviewKeyDown
If Not GcCalendarGrid1.IsCurrentCellInEditMode AndAlso e.KeyCode = Keys.ProcessKey Then GcCalendarGrid1.BeginEdit(False)
End Sub
Private Sub GcCalendarGrid1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles GcCalendarGrid1.PreviewKeyDown
If Not GcCalendarGrid1.IsCurrentCellInEditMode AndAlso e.KeyCode = Keys.ProcessKey Then GcCalendarGrid1.BeginEdit(False)
End Sub
◎サンプルコード(C#)
// PreviewKeyDownイベントでセルを編集状態にする
private void gcCalendarGrid1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (!gcCalendarGrid1.IsCurrentCellInEditMode && e.KeyCode == Keys.ProcessKey)
{
gcCalendarGrid1.BeginEdit(false);
}
}
private void gcCalendarGrid1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (!gcCalendarGrid1.IsCurrentCellInEditMode && e.KeyCode == Keys.ProcessKey)
{
gcCalendarGrid1.BeginEdit(false);
}
}
【FlexGrid for WinForms(ComponentOne Studio)】
・回避策(1)
文字入力が開始する前に強制的にセルを編集状態にします。
◎サンプルコード(VB)
' EditOnRequestをオフにして常時入力モードにする
C1FlexGrid1.EditOptions -= C1.Win.C1FlexGrid.EditFlags.EditOnRequest
C1FlexGrid1.EditOptions -= C1.Win.C1FlexGrid.EditFlags.EditOnRequest
◎サンプルコード(C#)
// EditOnRequestをオフにして常時入力モードにする
c1FlexGrid1.EditOptions -= C1.Win.C1FlexGrid.EditFlags.EditOnRequest;
c1FlexGrid1.EditOptions -= C1.Win.C1FlexGrid.EditFlags.EditOnRequest;
・回避策(2)
Windows 10 April 2018 Update (v1803) にバージョンアップする共に、アプリケーション側で、FormのOnShownメソッドをオーバーライドし、疑似的に最初の編集を終えた状態にするための以下のようなコードを追加します。
※これは、FlexGrid上で動くIME/TSF側に対して初期化の機会を与える変更を行うためです。
◎サンプルコード(VB)
Protected Overrides Sub OnShown(e As EventArgs)
MyBase.OnShown(e)
C1FlexGrid1.StartEditing()
C1FlexGrid1.FinishEditing()
End Sub
MyBase.OnShown(e)
C1FlexGrid1.StartEditing()
C1FlexGrid1.FinishEditing()
End Sub
◎サンプルコード(C#)
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
c1FlexGrid1.StartEditing();
c1FlexGrid1.FinishEditing();
}
{
base.OnShown(e);
c1FlexGrid1.StartEditing();
c1FlexGrid1.FinishEditing();
}
【True DBGrid for WinForms(ComponentOne Studio)】
◎サンプルコード(VB)
' RowColChangeイベントでEditActiveをTrueにして常時入力モードにする
Private Sub C1TrueDBGrid1_RowColChange(sender As Object, e As C1.Win.C1TrueDBGrid.RowColChangeEventArgs) Handles C1TrueDBGrid1.RowColChange
C1TrueDBGrid1.EditActive = True
End Sub
Private Sub C1TrueDBGrid1_RowColChange(sender As Object, e As C1.Win.C1TrueDBGrid.RowColChangeEventArgs) Handles C1TrueDBGrid1.RowColChange
C1TrueDBGrid1.EditActive = True
End Sub
◎サンプルコード(C#)
// RowColChangeイベントでEditActiveをTrueにして常時入力モードにする
private void c1TrueDBGrid1_RowColChange(object sender, C1.Win.C1TrueDBGrid.RowColChangeEventArgs e)
{
c1TrueDBGrid1.EditActive = true;
}
private void c1TrueDBGrid1_RowColChange(object sender, C1.Win.C1TrueDBGrid.RowColChangeEventArgs e)
{
c1TrueDBGrid1.EditActive = true;
}
なお、以上の回避策は各製品の最新バージョンを使用して確認しています。各製品の旧バージョンの場合は、上記コードを参考に対応をご検討ください。
旧文書番号
82485