MESCIUS SPREAD for Windows Forms 17.0J サンプルコード集
展開された子階層上での入力マップを変更する

変更された入力マップの定義は、基本的に親階層でのみ有効となります。 SPREADでは親階層と子階層それぞれが別のワークブックとして扱われるため、子階層上での入力マップを変更したい場合には、 SPREADコントロールの子ワークブックが作成されたときに発生するChildWorkbookCreatedイベントを実装し、子ワークブックに対して入力マップの変更を行う必要があります。具体的な実装方法については以下のサンプルをご参照ください。

  • 例えば親階層上での[Tab]キー押下を行った場合、アクティブセルの移動は親階層上でのみ行われます。(子階層へは移動しません)また子階層上でも同様の動作となります。
  • 独自の機能を実装するためにファンクションキー([F2]〜[F4]など)のKeyイベントを発生させたい場合は、あらかじめこれらのキーに対する入力マップの定義を無効にしておく必要があります。
  • セルが編集中の場合や常時入力モード(EditModePermanentプロパティ=True)を定義している場合、[F10]キー押下によるSPREADのKeyDownイベントが発生しないことがあります。Windowsでは[F10]キーを[Alt]キーと同機能(メニューバーをアクティブにする)として使っており、SPREAD側ではこの動作を制御することができません。
  • 入力マップには2種類の適用条件があります。
    1. WhenFocused(コントロールにフォーカスがある場合:セル非編集モード)
    2. WhenAncestorOfFocused(コントロールまたはその子にフォーカスがある場合:セル編集モード)
  • 入力マップによる動作は、設定されているシートの操作モード(SheetViewクラスのOperationModeプロパティ)やセルの編集状態に大きく関係します。そのため、変更時には十分な動作検証を行う必要があります。
  • 編集中セルでは入力用のエディタコントロール(FpSpread1.EditingControl)が使われます。当コントロールはOSが提供するエディタクラスを利用しているため、例えば編集中セルにおける[BackSpace]キーなど、一般的な入力補助機能を制御することはできません。

 private void Form1_Load(object sender, System.EventArgs e)
 {

   //親階層における[Enter]キーの入力マップを変更します
   FarPoint.Win.Spread.InputMap im = new FarPoint.Win.Spread.InputMap();
   im = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused);
   im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow);
   im = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused);
   im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow);

   DataSet ds = new DataSet();
   DataTable fpParent = new DataTable();
   DataTable fpChild1 = new DataTable();

   fpParent = ds.Tables.Add("SAMPLE");
   fpParent.Columns.AddRange(new DataColumn[] {new DataColumn("Column1", Type.GetType("System.String")), new DataColumn("Column2", Type.GetType("System.Int32"))});
   fpParent.Rows.Add(new object[] {"Parent1", 0});
   fpParent.Rows.Add(new object[] {"Parent2", 1});

   fpChild1 = ds.Tables.Add("Child1");
   fpChild1.Columns.AddRange(new DataColumn[] {new DataColumn("Column1", Type.GetType("System.String")), new DataColumn("Column2", Type.GetType("System.Int32"))});
   fpChild1.Rows.Add(new object[] {"Child1-1", 0});
   fpChild1.Rows.Add(new object[] {"Child1-2", 0});
   fpChild1.Rows.Add(new object[] {"Child1-3", 0});
   fpChild1.Rows.Add(new object[] {"Child2-1", 1});
   fpChild1.Rows.Add(new object[] {"Child2-2", 1});
   fpChild1.Rows.Add(new object[] {"Child2-3", 1});

   ds.Relations.Add("Relation1", fpParent.Columns["Column2"], fpChild1.Columns["Column2"]);
   fpSpread1.ActiveSheet.DataSource = ds;

   //子階層を展開します
   fpSpread1.ActiveSheet.ExpandRow(-1, true);

 }

 private void fpSpread1_ChildWorkbookCreated(object sender, FarPoint.Win.Spread.ChildWorkbookCreatedEventArgs e)
 {

   //子階層における[Enter]キーの入力マップを変更します(e.Workbook:子SpreadViewに対して)
   FarPoint.Win.Spread.InputMap im = new FarPoint.Win.Spread.InputMap();

   im = e.Workbook.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused);
   im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow);
   im = e.Workbook.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused);
   im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow);

 } 
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

   '親階層における[Enter]キーの入力マップを変更します
   Dim im As New FarPoint.Win.Spread.InputMap
   im = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused)
   im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow)
   im = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused)
   im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow)

   Dim ds As New DataSet
   Dim fpParent As DataTable
   Dim fpChild1 As DataTable
   fpParent = ds.Tables.Add("SAMPLE")
   fpParent.Columns.AddRange(New DataColumn() {New DataColumn("Column1", Type.GetType("System.String")), New DataColumn("Column2", Type.GetType("System.Int32"))})
   fpParent.Rows.Add(New Object() {"Parent1", 0})
   fpParent.Rows.Add(New Object() {"Parent2", 1})

   fpChild1 = ds.Tables.Add("Child1")
   fpChild1.Columns.AddRange(New DataColumn() {New DataColumn("Column1", Type.GetType("System.String")), New DataColumn("Column2", Type.GetType("System.Int32"))})
   fpChild1.Rows.Add(New Object() {"Child1-1", 0})
   fpChild1.Rows.Add(New Object() {"Child1-2", 0})
   fpChild1.Rows.Add(New Object() {"Child1-3", 0})
   fpChild1.Rows.Add(New Object() {"Child2-1", 1})
   fpChild1.Rows.Add(New Object() {"Child2-2", 1})
   fpChild1.Rows.Add(New Object() {"Child2-3", 1})

   ds.Relations.Add("Relation1", fpParent.Columns("Column2"), fpChild1.Columns("Column2"))
   FpSpread1.ActiveSheet.DataSource = ds

   '子階層を展開します
   FpSpread1.ActiveSheet.ExpandRow(-1, True)

 End Sub

 Private Sub FpSpread1_ChildWorkbookCreated(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChildWorkbookCreatedEventArgs) Handles FpSpread1.ChildWorkbookCreated

   '子階層における[Enter]キーの入力マップを変更します(e.Workbook:子SpreadViewに対して)
   Dim im As New FarPoint.Win.Spread.InputMap

   im = e.Workbook.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused)
   im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow)
   im = e.Workbook.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused)
   im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow)

 End Sub 

 

 


© MESCIUS inc. All rights reserved.