GrapeCity.devlog

グレープシティ株式会社のDeveloper Tools〈開発支援ツール〉の最新情報をお届けします。製品のTIPSや発売情報、イベントのお知らせなどをいち早く発信中です。

グリッドのセルに文字を入力した場合の不正な動作

Windows 10環境において、SPREADやMultiRowなどのWindowsフォーム用グリッドコンポーネントを使用したとき、セルに日本語を入力しても正しく表示されないことがあります。

f:id:GrapeCity_dev:20171226141839p:plain

図のように、ローマ字入力で「た」を入力する場合、非編集モード状態のセルに「t」「a」とキーボード入力すると、セルが編集モード状態になった際に「た」ではなく「tあ」と入力されます。さらに「t」は確定状態で、「あ」が未確定の状態です。
同様に、日本語入力で「k」を非編集モード状態のセルに入力すると、セルが編集状態になったにもかかわらず「k」が入力されない状態になります。

問題が発生している状況

Windowsフォーム用コンポーネントで、セルが非編集の状態から直接キー押下で文字を入力する際の動作が不正になる現象が確認されています。弊社製品を含め以下のコンポーネントで発生しています。

  • DataGridView(Visual Studioに付属する.NET Framework標準)
  • SPREAD for Windows Forms
  • MultiRow for Windows Forms
  • CalendarGrid for Windows Forms
  • FlexGrid for WinForms(ComponentOne Studioに含まれる)
  • True DBGrid for WinForms(ComponentOne Studioに含まれる)

これはWindows 10にFall Creators Updateを適用した場合のみで発生します。

Microsoftの情報によると、この現象はFall Creators Updateが原因で、文字入力によってセルが非編集状態から編集状態に切り替わる際の入力確定のタイミングが不正になるために発生しているようです。

Fall Creators Update を適用後 DataGridView に文字を入力すると 2 文字入力される – JAPAN Platform SDK(Windows SDK) Support Team Blog*1

問題を回避するには

Windows 10の動作が問題なので、OSのアップデートを待つ必要があります。
ただし、弊社製品では機能を利用してこの問題を回避することもできます。

各コンポーネントが提供するキー関連イベントや常時入力モードを利用して、文字入力が開始する前に強制的にセルを編集状態にすることで、正しくキー操作した内容が表示されます。

以下の各製品の回避コードを参考に対応をご検討ください。

SPREADの回避方法

対象製品:SPREAD for Windows Forms 各バージョン

Visual Basic
' 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
C#
// PreviewKeyDownイベントでセルを編集状態にする
private void fpSpread1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
  if (!fpSpread1.EditMode && e.KeyCode == Keys.ProcessKey)
  {
    fpSpread1.EditMode = true;
  }
}

セルが編集モードではない状態で、キー入力がKeys.ProcessKeyでIMEの状態が漢字変換中かどうかを判断し、変換中の場合にSPREADの編集モードを有効にしています。

FlexGridの回避方法

対象製品:FlexGrid for Windows Forms(ComponentOne Studio)

Visual Basic
' EditOnRequestをオフにして常時入力モードにする
C1FlexGrid1.EditOptions -= C1.Win.C1FlexGrid.EditFlags.EditOnRequest
C#
// EditOnRequestをオフにして常時入力モードにする
c1FlexGrid1.EditOptions -= C1.Win.C1FlexGrid.EditFlags.EditOnRequest;

ComponentOne StudioのFlexGridは、EditOnRequestプロパティを制御して常時入力モードに切り替える方法で行います。

ナレッジベースの公開

同様の方法で他コンポーネント、MultiRow、CalendarGridやTrue DBGridも回避できます。
ナレッジベースで詳細を解説していますのでご参照ください。

Windows 10にFall Creators Updateを適用すると文字入力動作が不正になる - .NET 製品共通 - ナレッジベースの詳細*2

回避方法はナレッジベースで提供していますが、根本的な問題はWindows 10の今後提供されるアップデートで解決されることに期待します。
問題が解決した場合は、ナレッジベースまたはこちらの「GrapeCity.devlog」で情報を提供します。


追記:2018年7月4日
2018年6月25日に、文中にあるMicrosoftの情報が更新され、原因と回避方法が提供されました。
ナレッジベースの情報にも回避策を追加しています。

原因

<2018 年 6 月 25 日 (月) 更新>
この現象は、Windows 10 Fall Creators Update (v1709) の IME/TSF (Text Service Framework) の不具合が原因で発生していました。

回避方法

<2018 年 6 月 25 日 (月) 更新>
以下のいずれかの回避方法をご利用ください。

回避方法 (1)
セルを 2 回クリックして、セル自体が選択されている状態を解除してから文字を入力します。
回避方法 (2)
Windows 10 April 2018 Update (v1803) にバージョンアップすると共に、アプリケーション側でもこの修正に対応するためのプログラムの変更を行います。

*1:2018年6月25日更新

*2:2018年6月29日更新