検証コンポーネントのResetValidationStateメソッドを実行すると、コントロールの前景色と背景色が既定値に戻る場合がある

文書番号 : 41006     文書種別 : 技術情報     登録日 : 2017/08/25     最終更新日 : 2017/08/25
文書を印刷する
対象製品
InputMan for Windows Forms 10.0J
詳細
検証コンポーネントを設定したコントロールで検証アクションのColorNotifyを使用していると、検証コンポーネントのResetValidationStateメソッドの実行時にコントロールの前景色と背景色(ForeColor/BackColorプロパティ)が既定値(WindowText/Window)に戻ってしまいます。

この現象はすべての検証コントロールで発生します。

コントロールの色設定の情報をあらかじめ保存しておいて、ResetValidationStateメソッドを実行した後に再設定することで本現象を回避することができます。

以下は汎用検証コンポーネントを使用した例です。

[Visual Basic]
Public Class Form1

    Private _originalForeColorDict As New Dictionary(Of Control, Color)
    Private _originalBackColorDict As New Dictionary(Of Control, Color)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' コントロールの色設定を保存します
        _originalForeColorDict.Clear()
        _originalBackColorDict.Clear()
        BackupOldColorSettings()

        GcCommonValidator1.ResetValidationState()

        ' コントロールの色を再設定します
        ResetOldColorSettings()

    End Sub

    Private Sub BackupOldColorSettings()
        CheckColorSettingsFor(Me)
    End Sub

    ' コントロールの色設定の保存と再設定
    Private Sub CheckColorSettingsFor(ByVal control As Control)
        If control Is Nothing Then
            Return
        End If

        If ShouldSerializeTargetControlForeColor(control) Then
            _originalForeColorDict.Add(control, control.ForeColor)
        End If

        If ShouldSerializeTargetControlBackColor(control) Then
            _originalBackColorDict.Add(control, control.BackColor)
        End If

        If Not control.HasChildren Then
            Return
        End If

        For index = 0 To control.Controls.Count - 1
            CheckColorSettingsFor(control.Controls(index))
        Next

    End Sub

    Private Sub ResetOldColorSettings()
        For index = 0 To _originalForeColorDict.Keys.Count - 1
            Dim key = _originalForeColorDict.Keys(index)

            key.ForeColor = _originalForeColorDict(key)
        Next

        For index = 0 To _originalBackColorDict.Keys.Count - 1
            Dim key = _originalBackColorDict.Keys(index)

            key.BackColor = _originalBackColorDict(key)
        Next

    End Sub

    Private Function ShouldSerializeTargetControlForeColor(ByVal control As Control) As Boolean
        Dim methodInfo = control.GetType.GetMethod("ShouldSerializeForeColor", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
        If methodInfo Is Nothing Then
            Return False
        End If

        Return DirectCast(methodInfo.Invoke(control, Nothing), Boolean)

    End Function

    Private Function ShouldSerializeTargetControlBackColor(ByVal control As Control) As Boolean
        Dim methodInfo = control.GetType.GetMethod("ShouldSerializeBackColor", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
        If methodInfo Is Nothing Then
            Return False
        End If

        Return DirectCast(methodInfo.Invoke(control, Nothing), Boolean)

    End Function

End Class


[C#]
using System.Reflection;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // コントロールの色設定を保存します
            BackupOldColorSettings();

            gcCommonValidator1.ResetValidationState();

            // コントロールの色を再設定します
            ResetOldColorSettings();
        }

        // コントロールの色設定の保存と再設定
        private Dictionary _originalForeColorDict = new Dictionary();
        private Dictionary _originalBackColorDict = new Dictionary();

        private void ResetOldColorSettings()
        {
            foreach (Control key in _originalForeColorDict.Keys)
            {
                key.ForeColor = _originalForeColorDict[key];
            }

            foreach (Control key in _originalBackColorDict.Keys)
            {
                key.BackColor = _originalBackColorDict[key];
            }
        }

        private void BackupOldColorSettings()
        {
            CheckColorSettingsfor(this);
        }

        private void CheckColorSettingsfor(Control control)
        {
            if (control == null)
            {
                return;
            }

            if (ShouldSerializeTargetControlForeColor(control))
            {
                _originalForeColorDict.Add(control, control.ForeColor);
            }

            if (ShouldSerializeTargetControlBackColor(control))
            {
                _originalBackColorDict.Add(control, control.BackColor);
            }

            if (!control.HasChildren)
            {
                return;
            }

            for (int index = 0; index < control.Controls.Count; index++)
            {
                CheckColorSettingsfor(control.Controls[index]);
            }
        }

        private bool ShouldSerializeTargetControlForeColor(Control control)
        {
            MethodInfo methodInfo = control.GetType().GetMethod("ShouldSerializeForeColor", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public);
            if (methodInfo == null)
            {
                return false;
            }

            return (bool)(methodInfo.Invoke(control, null));
        }

        private bool ShouldSerializeTargetControlBackColor(Control control)
        {
            MethodInfo methodInfo = control.GetType().GetMethod("ShouldSerializeBackColor", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public);
            if (methodInfo == null)
            {
                return false;
            }

            return (bool)(methodInfo.Invoke(control, null));
        }
    }
}