気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
前回、仕訳入力画面の表を表示するところまでのソースを説明しました。
本日は、表の中のセルを方向キーやエンターキーで移動できるようにする部分を紹介します。

前回、紹介しましたように仕訳入力用の表は、Gridパネルの中にTextBoxコントロールを配置する
仕組みをとっています。WindowsフォームのDataGridViewのようなコントロールを使用していません。
ですので、方向キーを使ったセル間の移動なども自分で実装する必要がありました。

以下は前回紹介しましたC#のコードから表に行を追加する部分の一部ですが、
行を追加する際にTextBoxのTagにGridCellというクラスのインスタンスを設定しています。
これはテキストボックスの表の中での位置(列と行)を管理するためのクラスとして定義したものです。

方向キーが押された場合のセル移動処理を行う際にこのクラスの情報を使用しています。
また、表の中に配置されたコントロールは、表の行と列の構成をそのまま保持できるように
2次元配列(_cells)に入れて管理しています。

 TextBox drAccountCD = new TextBox();
 drAccountCD.BorderThickness = new Thickness(0, 0, 1, 1);
 drAccountCD.VerticalContentAlignment = VerticalAlignment.Center;
 drAccountCD.Tag = new GridCell(1, rowNum);
 InputMethod.SetIsInputMethodEnabled(drAccountCD,false);

 _cells[rowNum, 1] = drAccountCD;

本題の方向キーやエンタキーが押された場合の処理に入ります。
この処理は「JournalGrid.xaml.cs」の中でOnPreviewKeyDownメソッドをオーバーライドすることで
行います。方向キーなどの特殊キーの処理は、要素ツリーの上から下の順番に伝えられる「Tunnel」方向の
RoutedEventを処理する必要があります。(「Bubble」方向では、キーが押されたことが認識されません。)

以下はOnPreviewKeyDown()メソッドのコードの一部です。
 //イベントソースを取得する
 TextBox textBox = e.OriginalSource as TextBox;

 //ソースがTextBox以外の場合、処理しない
 if (textBox == null)
 {
     return;
 }

 //Grid内の位置情報を取得する
 GridCell cell = textBox.Tag as GridCell;

 //左キー
 if (e.Key == Key.Left)
 {
     for (int i = cell.ColIndex - 1; i >= 0; i--)
     {
         if (_cells[cell.RowIndex, i] is TextBox)
         {
             if (!(_cells[cell.RowIndex, i] as TextBox).IsReadOnly)
             {
                 _cells[cell.RowIndex, i].Focus();
                 (_cells[cell.RowIndex, i] as TextBox).CaretIndex = 0;

                 //フォーカスが移動した後、カレットが移動しないように処理済にする
                 e.Handled = true;

                 break;
             }
         }
     }
 }

明細行を追加する際に、設定しておいたGridCellの情報と表の中のコントロールを管理する2次元配列を
使用してフォーカスを移動する処理を行っています。WPFのルーティングイベントシステムでは
明示的にイベントを処理済みにしないと要素ツリーの次の要素で処理が継続して行われます。
今回、フォーカスを移した後に、イベントを処理済にしているのは、「JournalGrid」の子要素である
セルに配置されたTextBoxが、方向キーのイベントを処理することによりTextBox内のカレット位置が移動することを防止するためです。

次回は勘定科目CDが入力された際に勘定科目の候補をGrid内に表示する部分を紹介します。

本日のソース






コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/31-7ec76353

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。