Mr.Tです、こんにちは。
ネタ元:http://www.ailight.jp/blog/kazuk/archive/2008/02/22/14491.aspx
ValidatorをASPXファイルに書いていると、やたらと行数を稼いでしまって、なんだか見難いようにも
おもってました。
今回は、今のプロジェクトで利用しているカスタムのコントロールに検証機能を追加するようにしてみたものです。
#コントロールは、プロジェクトで使用する製品CDのようなコード群をTextBox形式で扱うためのコントロールです。
入力値は必ずチェックをするものなので、基本チェックは何をしなくてもValidして欲しい、
更に、必要であれば個別にValidate処理を実装できるようにする必要がありました。
Protected Overrides Sub CreateChildControls()
nameTextBox = New TextBox
nameTextBox.ID = NameTextBoxID
nameTextBox.Width = Me.NameWidth
nameValidator = New CustomValidator
With nameValidator
.ID = NameValidatorID
.ValidationGroup = _validateGroupName
.Text = "*"
End With
AddHandler nameValidator.ServerValidate, AddressOf OnServerValid
Controls.Clear()
Controls.Add(nameTextBox)
Controls.Add(nameValidator)
End Sub
Private _targetServerValidateEventArgs As ServerValidateEventArgs
Public Sub NameBoxValidate()
Me.EnsureChildControls()
_targetServerValidateEventArgs = New ServerValidateEventArgs(nameTextBox.Text, False) ...(*1)
Me.OnTextServerValidate(Me, _targetServerValidateEventArgs)
nameValidator.IsValid = _targetServerValidateEventArgs.IsValid
End Sub
'サーバ上での基本Valid処理 Private Sub OnServerValid(
ByVal source
As Object,
ByVal events
As ServerValidateEventArgs)
If ************
Then events.IsValid =
False nameValidator.ErrorMessage = Resources.****
Else events.IsValid =
True nameValidator.ErrorMessage =
String.Empty
End If End Sub Private Shared ReadOnly EventTextServerValidateKey
As Object =
New Object Public Custom
Event TextServerValidate
As ServerValidateEventHandler
AddHandler(
ByVal value
As ServerValidateEventHandler)
Events.
AddHandler(EventTextServerValidateKey, value)
End AddHandler RemoveHandler(
ByVal value
As ServerValidateEventHandler)
Events.
RemoveHandler(EventTextServerValidateKey, value)
End RemoveHandler RaiseEvent(
ByVal sender
As Object,
ByVal e
As ServerValidateEventArgs)
CType(Events(EventTextServerValidateKey), ServerValidateEventHandler).Invoke(
Me, e)
End RaiseEvent End Event Protected Overridable Sub OnTextServerValidate(
ByVal source
As Object,
ByVal e
As ServerValidateEventArgs)
Dim validateHandler
As ServerValidateEventHandler =
CType(Events(EventTextServerValidateKey), ServerValidateEventHandler)
EnsureChildControls()
nameValidator.Validate()
If EventTextServerValidateKey IsNot
Nothing Then validateHandler(
Me, e)
End If End Sub
ASPX側では、
Protected Sub 個別Valid(byval sender as Object,byval e as ServerValidateEventArgs) handles CustomControl.TextServerValidate
ほにゃらら~
ここで独自のチェックができるぞよ~
end Sub
そんなに難しいわけじゃないんですが、OnServerValidの呼び出しの際、ServerValidateEventArgsオブジェクトのパラメータを
どうするべと悩んだのはないしょです。
Clickイベントなどであれば、EventArgs.Emptyをパラメータとして渡せばよいわけですが、今回は、ServerValidateEventArgsなので、
ServerValidateEventArgs.Emptyを渡せません。
そんなら、インスタンスを渡せばええんかいな~と調べてみて、
http://msdn2.microsoft.com/en-gb/library/system.web.ui.webcontrols.servervalidateeventargs.servervalidateeventargs(ja-jp,VS.80).aspx
ここで、Valueと、IsValidを指定すればよいことがわかったので、そのまま(*1)実装。
で、渡したパラメータに対して、CustomValidatorコントロールのIsValidに結果をわたせばいいです。
検証コントロールなんかなくなってしまって、いい感じです。