GcButtonのPerformClickメソッドを呼び出してもアクティブコントロールのValidatedイベントなどが発生しない

文書番号 : 39643     文書種別 : 不具合     登録日 : 2016/10/25     最終更新日 : 2017/11/21
文書を印刷する
対象製品
PlusPak for Windows Forms 8.0J
状況
修正済み
詳細
GcButtonコントロールのPerformClickメソッドを呼び出しても、その時点のアクティブコントロールのValidatingとValidatedイベントが発生しません。
回避方法
この問題はService Pack 3(v8.0.2017.1121)で修正されました。
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。

Service Pack 3より前のバージョンでは次の方法で回避可能です。

次のように継承コントロールを作成して使用することで現象を回避することができます。

[サンプルコード]

public class MyGcButton: GcButton
    {
        protected override void OnClick(EventArgs e)
        {
            if (this.CanSelect)
            {
                bool flag;
                bool flag2 = this.BaseValidateActiveControl(out flag);

                if (!this.BaseValidationCancelled && (flag2 | flag))
                {
                    base.OnClick(e);
                }
            }
        }

        public bool BaseValidationCancelled
        {
            get
            {
                var validationCanclledMethod = typeof(Control).GetProperty("ValidationCancelled", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

                if (validationCanclledMethod != null)
                {
                    return (bool)validationCanclledMethod.GetValue(this);
                }
                return false;
            }
        }

        public bool BaseValidateActiveControl(out bool validatedControlAllowsFocusChange)
        {
            var baseValidateActionCtrolMethod = typeof(Control).GetMethod("ValidateActiveControl", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

            bool result = true;

            if (baseValidateActionCtrolMethod != null)
            {
                object[] parameters = new object[] { null };
                result = (bool) baseValidateActionCtrolMethod.Invoke(this, parameters);
                validatedControlAllowsFocusChange = (bool)parameters[0];
            }
            else
            {
                validatedControlAllowsFocusChange = true;
            }

            return result;

        }
}
キーワード
PPWI20021