GcButtonのPerformClickメソッドを呼び出してもアクティブコントロールのValidatedイベントなどが発生しない
対象製品
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;
}
}
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。
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