Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  253  : 記事  0  : コメント  3733  : トラックバック  52

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板

書庫

日記カテゴリ

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に結果をわたせばいいです。

検証コントロールなんかなくなってしまって、いい感じです。

投稿日時 : 2008年3月5日 14:37

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント