コンテナに配置するとショートカットキーで次のコントロールに移動できない

文書番号 : 26301     文書種別 : 不具合     最終更新日 : 2008/10/10
文書を印刷する
対象製品
MultiRow for Windows Forms 5.0J
発生環境
v5.0.2008.0430
v5.0.2008.0930
状況
修正済み
詳細
GcMultiRowコントロールをコンテナコントロール(Panelなど)に配置すると、ComponentActions.SelectNextControl または ComponentActions.SelectPreviousControl で登録したショートカットキーで次または前のコントロールに移動することができません。

再現手順
1.フォームにコンテナコントロールを配置する(Panel1)。
2.Panel1 にテキストボックスを配置する(TextBox1)。
3.Panel1 に GcMultiRow コントロールを配置する(GcMultiRow1)。
4.Panel1 にテキストボックスを配置する(TextBox2)。
5.フォームにテキストボックスを配置する(TextBox3)。
6.Form.Load イベントで次のコードを実行する。

[Visual Basic]
Imports GrapeCity.Win.MultiRow

' Tab キーをコントロール間の移動に割り当てる(既定はセル間の移動)
GcMultiRow1.ShortcutKeyManager.Register(ComponentActions.SelectNextControl, Keys.Tab)
GcMultiRow1.ShortcutKeyManager.Register(ComponentActions.SelectPreviousControl, Keys.Shift Or Keys.Tab)

[C#]
using GrapeCity.Win.MultiRow;

// Tab キーをコントロール間の移動に割り当てる(既定はセル間の移動)
gcMultiRow1.ShortcutKeyManager.Register(ComponentActions.SelectNextControl, Keys.Tab);
gcMultiRow1.ShortcutKeyManager.Register(ComponentActions.SelectPreviousControl, Keys.Shift | Keys.Tab);
7.プロジェクトを実行し、GcMultiRow1 で Tab キーを押すと、TextBox2 をスキップして TextBox3 にフォーカスが移動してしまう。
回避方法
この現象は、MultiRow for Windows Forms 5.0J 修正版(v5.0.2009.0116)で修正されています。
最新のService Packのダウンロードはこちら

または、組み込みのアクション(ComponentActions)の代わりに、カスタムアクションを作成することでこの現象を回避できます。

[Visual Basic]
Imports GrapeCity.Win.MultiRow

' ComponentActions.SelectNextControl の代替カスタムアクション
Public Class CustomNext
  Implements IAction

  Public Function CanExecute(ByVal target As GrapeCity.Win.MultiRow.GcMultiRow) As Boolean Implements GrapeCity.Win.MultiRow.IAction.CanExecute
    Return True
  End Function

  Public ReadOnly Property DisplayName() As String Implements GrapeCity.Win.MultiRow.IAction.DisplayName
    Get
      Return Me.ToString()
    End Get
  End Property

  Public Sub Execute(ByVal target As GrapeCity.Win.MultiRow.GcMultiRow) Implements GrapeCity.Win.MultiRow.IAction.Execute
    target.Parent.SelectNextControl(target, True, True, True, True)
  End Sub
End Class

' ComponentActions.SelectPreviousControl の代替カスタムアクション
Public Class CustomPrevious
  Implements IAction

  Public Function CanExecute(ByVal target As GrapeCity.Win.MultiRow.GcMultiRow) As Boolean Implements GrapeCity.Win.MultiRow.IAction.CanExecute
    Return True
  End Function

  Public ReadOnly Property DisplayName() As String Implements GrapeCity.Win.MultiRow.IAction.DisplayName
    Get
      Return Me.ToString()
    End Get
  End Property

  Public Sub Execute(ByVal target As GrapeCity.Win.MultiRow.GcMultiRow) Implements GrapeCity.Win.MultiRow.IAction.Execute
    target.Parent.SelectNextControl(target, False, True, True, True)
  End Sub
End Class

' ショートカットキーとして登録するコード
GcMultiRow1.ShortcutKeyManager.Register(New CustomNext(), Keys.Tab)
GcMultiRow1.ShortcutKeyManager.Register(New CustomPrevious(), Keys.Shift Or Keys.Tab)

[C#]
using GrapeCity.Win.MultiRow;

// ComponentActions.SelectNextControl の代替カスタムアクション
public class CustomNext : IAction
{
  public bool CanExecute(GcMultiRow target)
  {
    return true;
  }

  public string DisplayName
  {
    get { return this.ToString(); }
  }

  public void Execute(GcMultiRow target)
  {
    target.Parent.SelectNextControl(target, true, true, true, true);
  }
}

// ComponentActions.SelectPreviousControl の代替カスタムアクション
public class CustomPrevious : IAction
{
  public bool CanExecute(GcMultiRow target)
  {
    return true;
  }

  public string DisplayName
  {
    get { return this.ToString(); }
  }

  public void Execute(GcMultiRow target)
  {
    target.Parent.SelectNextControl(target, false, true, true, true);
  }
}

// ショートカットキーとして登録するコード
gcMultiRow1.ShortcutKeyManager.Register(new CustomNext(), Keys.Tab);
gcMultiRow1.ShortcutKeyManager.Register(new CustomPrevious(), Keys.Shift | Keys.Tab);
キーワード
MLTR07042

この文書は、以前は次のバグレポートIDで公開されていました : 7680