作成日: 2024/01/19 最終更新日: 2024/01/31
文書種別
制限事項
詳細
この現象はシステムから送られるメッセージの順序が通常のキーボードとタッチキーボードで異なることが原因となります。
通常のキーボードの場合、キーが押された際のWM_KEYDOWNメッセージはWM_IME_STARTCOMPOSITIONより前に発生します。しかし、タッチキーボードの場合、WM_KEYDOWNメッセージはWM_IME_STARTCOMPOSITIONメッセージの後に発生します。
MultiRowはWM_IME_STARTCOMPOSITIONメッセージを受け取ることで編集を開始しフォーカスが編集コントロールに移動する実装となっております。そのため、タッチキーボードの場合には、MultiRowはWM_KEYDOWNメッセージを取得できず、結果としてPreviewKeyDownなどのキー押下のイベントを発生させるタイミングがありません。
上記によりこの動作はOSと製品の実装方法による制限となります。
通常のキーボードの場合、キーが押された際のWM_KEYDOWNメッセージはWM_IME_STARTCOMPOSITIONより前に発生します。しかし、タッチキーボードの場合、WM_KEYDOWNメッセージはWM_IME_STARTCOMPOSITIONメッセージの後に発生します。
MultiRowはWM_IME_STARTCOMPOSITIONメッセージを受け取ることで編集を開始しフォーカスが編集コントロールに移動する実装となっております。そのため、タッチキーボードの場合には、MultiRowはWM_KEYDOWNメッセージを取得できず、結果としてPreviewKeyDownなどのキー押下のイベントを発生させるタイミングがありません。
上記によりこの動作はOSと製品の実装方法による制限となります。
回避方法
セルの編集開始をイベントとして取得したい場合にはPreviewKeyDownなどのキー押下のイベントではなく、MultiRowのセルが変更されたときやコントロールが入力フォーカスを受け取ったときに発生するCellEnterイベントおよびShownイベントを使用することで回避できます。以下の回避コードを参考に対応をご検討ください。
◎サンプルコード(VB)
◎サンプルコード(C#)
◎サンプルコード(VB)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' セル型の作成
Dim textCell1 As New TextBoxCell()
textCell1.Style.ImeMode = ImeMode.Hiragana
' MultiRowの設定
GcMultiRow1.Template = Template.CreateGridTemplate(New GrapeCity.Win.MultiRow.Cell() {textCell1})
GcMultiRow1.RowCount = 5
End Sub
' 初期表示のセルを編集モードにする
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
GcMultiRow1.BeginEdit(False)
End Sub
' セル移動時に編集モードにする
Private Sub GcMultiRow1_CellEnter(sender As Object, e As CellEventArgs) Handles GcMultiRow1.CellEnter
GcMultiRow1.BeginEdit(False)
End Sub
' セル型の作成
Dim textCell1 As New TextBoxCell()
textCell1.Style.ImeMode = ImeMode.Hiragana
' MultiRowの設定
GcMultiRow1.Template = Template.CreateGridTemplate(New GrapeCity.Win.MultiRow.Cell() {textCell1})
GcMultiRow1.RowCount = 5
End Sub
' 初期表示のセルを編集モードにする
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
GcMultiRow1.BeginEdit(False)
End Sub
' セル移動時に編集モードにする
Private Sub GcMultiRow1_CellEnter(sender As Object, e As CellEventArgs) Handles GcMultiRow1.CellEnter
GcMultiRow1.BeginEdit(False)
End Sub
◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
// セル型の作成
TextBoxCell textCell1 = new TextBoxCell();
textCell1.Style.ImeMode = ImeMode.Hiragana;
// MultiRowの設定
gcMultiRow1.Template = Template.CreateGridTemplate(new GrapeCity.Win.MultiRow.Cell[] { textCell1 });
gcMultiRow1.RowCount = 5;
}
// 初期表示のセルを編集モードにする
private void Form1_Shown(object sender, EventArgs e)
{
gcMultiRow1.BeginEdit(false);
}
// セル移動時に編集モードにする
private void gcMultiRow1_CellEnter(object sender, CellEventArgs e)
{
gcMultiRow1.BeginEdit(false);
}
{
// セル型の作成
TextBoxCell textCell1 = new TextBoxCell();
textCell1.Style.ImeMode = ImeMode.Hiragana;
// MultiRowの設定
gcMultiRow1.Template = Template.CreateGridTemplate(new GrapeCity.Win.MultiRow.Cell[] { textCell1 });
gcMultiRow1.RowCount = 5;
}
// 初期表示のセルを編集モードにする
private void Form1_Shown(object sender, EventArgs e)
{
gcMultiRow1.BeginEdit(false);
}
// セル移動時に編集モードにする
private void gcMultiRow1_CellEnter(object sender, CellEventArgs e)
{
gcMultiRow1.BeginEdit(false);
}