作成日: 2017/08/25 最終更新日: 2017/08/25
文書種別
技術情報
詳細
検証コンポーネントを設定したコントロールで検証アクションのColorNotifyを使用していると、検証コンポーネントのResetValidationStateメソッドの実行時にコントロールの前景色と背景色(ForeColor/BackColorプロパティ)が既定値(WindowText/Window)に戻ってしまいます。
この現象はすべての検証コントロールで発生します。
コントロールの色設定の情報をあらかじめ保存しておいて、ResetValidationStateメソッドを実行した後に再設定することで本現象を回避することができます。
以下は汎用検証コンポーネントを使用した例です。
[Visual Basic]
[C#]
この現象はすべての検証コントロールで発生します。
コントロールの色設定の情報をあらかじめ保存しておいて、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));
}
}
}
旧文書番号
41007