none
検証コントロールについて RRS feed

  • 質問

  • お世話になります。

    現在、asp.net2.0 Vb.net2005で、WebApplicationを作成しています。

    そこで、マスターページを使用して、

    WebFormを作成しているのですが、

    WebFormにTextBox1を設定して、検証コントロールを動的に生成しているのですが↓

        Protected WithEvents Chk As RequiredFieldValidator

            Chk = New RequiredFieldValidator
       

         Chk.ControlToValidate = "TextBox1"

            Chk.ErrorMessage = "aaa"
            Chk.CssClass = "aa"
            Me.Master.Controls.Add(Chk)

    マスターページのContentFolderに入っているせいでだと思いますが、Textbox1がみつからないとエラーが出ます。

    どのようにすればエラーにならないでしょうか?

    2007年2月27日 12:36

回答

  • 以下のような感じで。

         Chk.ControlToValidate = "ContentPlaceHolder1$TextBox1"

         Me.Master.FindControl("Form1").Controls.Add(Chk)

    2007年2月28日 9:44
    モデレータ
  • trapemiyaさんの回答で良いと思いますが、こんなやり方もあります。

    Chk.ControlToValidate = TextBox1.UniqueID

    どうも検証コントロールはFindControlでControlToValidateのコントロールを探すようなので、対象のコントロールと検証コントロールが所属する名前付けコンテナが異なる場合はUniqueIDを利用する必要があるようです。

    逆に同じ名前付けコンテナに所属するようにすればIDで問題ないはずで、検証コントロールの追加位置をテキストボックスと同じ名前付けコンテナ(contentplaceholder)にする方法でもありだと思います。

    2007年2月28日 13:46

すべての返信

  • 申し訳ありません、以下のように修正してみた所、

            Chk = New RequiredFieldValidator
            Chk.ID = "CHK"
            Me.Form.Controls.Add(Chk)

            Chk.ControlToValidate = TextBox1.ClientID
            Chk.ErrorMessage = "aaa"
            Chk.CssClass = "aa"
    エラーがまだ出ます。

    'CHK' の 'ControlToValidate' プロパティで参照されたコントロール ID 'ctl00_ContentPlaceHolder1_TextBox1' が見つかりません。
    説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

    例外の詳細: System.Web.HttpException: 'CHK' の 'ControlToValidate' プロパティで参照されたコントロール ID 'ctl00_ContentPlaceHolder1_TextBox1' が見つかりません。

    マスターページを使っているフォームに検証コントロールを動的に作成するのは不可能なのでしょうか?

    2007年2月28日 5:42
  • 以下のような感じで。

         Chk.ControlToValidate = "ContentPlaceHolder1$TextBox1"

         Me.Master.FindControl("Form1").Controls.Add(Chk)

    2007年2月28日 9:44
    モデレータ
  • trapemiyaさんの回答で良いと思いますが、こんなやり方もあります。

    Chk.ControlToValidate = TextBox1.UniqueID

    どうも検証コントロールはFindControlでControlToValidateのコントロールを探すようなので、対象のコントロールと検証コントロールが所属する名前付けコンテナが異なる場合はUniqueIDを利用する必要があるようです。

    逆に同じ名前付けコンテナに所属するようにすればIDで問題ないはずで、検証コントロールの追加位置をテキストボックスと同じ名前付けコンテナ(contentplaceholder)にする方法でもありだと思います。

    2007年2月28日 13:46
  • trapemiyaさん、dotnetmemo さん、ありがとうございます。

    UniqueIDを使えばよかったのですね。

    助かりました。

    2007年3月1日 11:09