2009/04/19

[C#]Enterフォーカス遷移をどうにかしたいなーと

そう思って書いたのがこれでした。使い勝手は悪い。
ソースはココ
/// <summary>
/// フォーカス遷移機能を提供します。
/// ---Defined 2008/04/07
/// </summary>
public class ControlSelecter
{
    #region フィールドメンバ変数定義
    /// <summary>
    /// 対象フォーム格納メンバ
    /// </summary>
    private readonly Form TargetForm;
    /// <summary>
    /// 無視するコントロールのタイプを指定します。
    /// </summary>
    private readonly ArrayList IgnoreTypes;
    #endregion
    #region コンストラクタ
    /// <summary>
    /// コンストラクタ:デフォルト
    /// </summary>
    /// <param name="Target"></param>
    /// <param name="IgnoreControlTypes"></param>
    public ControlSelecter(Form Target, params Type[] IgnoreControlTypes)
    {
        this.TargetForm = Target;
        this.TargetForm.KeyPreview = true;
        this.IgnoreTypes = new ArrayList(IgnoreControlTypes);
    }
    /// <summary>
    /// コンストラクタ:オーバーロード
    /// </summary>
    /// <param name="Target"></param>
    public ControlSelecter(Form Target) : this(Target, new Type[]{}) {    }
    #endregion
    #region フォーカス遷移
    /// <summary>
    /// フォーカス遷移
    /// </summary>
    public virtual void Next(KeyEventArgs e)
    {
        //不正パラメータ検知
        if (this.TargetForm == null)
        {
            return;
        }
        if (e == null)
        {
            return;
        }
        if (!e.KeyCode.Equals(Keys.Enter))
        {
            return;
        }
        //アクティブコントロール取得
        System.Windows.Forms.Control ctl = this.TargetForm.ActiveControl;
        //コントロールチェック
        if (ctl == null)
        {
            return;
        }
        //フォーカス遷移
        this.TargetForm.SelectNextControl(ctl, !e.Shift, true, true, true);
        //アクティブコントロールを再取得
        ctl = this.TargetForm.ActiveControl;
        //再帰判定
        if (!this.CanSelect(ctl))
        {
            //再帰
            this.Next(e);
        }
        e.Handled = true;
    }
    #endregion
    #region フォーカス遷移可否判定
    /// <summary>
    /// フォーカス遷移可否判定
    /// </summary>
    /// <param name="ctl">対象コントロール</param>
    /// <returns>可否</returns>
    protected virtual bool CanSelect(System.Windows.Forms.Control ctl)
    {
        bool result = false;
        //nullチェック
        if (ctl == null)
        {
            return result;
        }
        //非表示は不可
        if (!ctl.Visible)
        {
            return result;
        }
        //使用不可は不可
        if (!ctl.Enabled)
        {
            return result;
        }
        //無視するコントロールかどうか判定
        if (this.IgnoreTypes != null)
        {
            if (this.IgnoreTypes.Contains(ctl.GetType()))
            {
                return result;
            }
        }
        return !result;
    }
    #endregion
}

絶対現場主義Visual C#実践講座―開発の現場から生まれた実践テクニック&TIPS集C#クックブック 第3版C#エッセンシャルズ 第2版

0 件のコメント:

コメントを投稿