2009-05-14 6 views
3

マスターから作成されたページのコンテンツエリアにあるWebユーザーコントロール内で、動的に生成されたテーブルセル内のRequiredFieldValidatorとRegularExpressionValidatorを動的に作成されたテキストボックスに追加する必要があります。ダイナミックコントロールのバリデーションナイトメアーC#

おそらく推測できるように、問題は動的に作成されたテキストボックスを見るためにControlToValidateプロパティを動的に設定しようとしています。

  • パネルを作成します(私が聞いてきたようにControlToValidateとValidatorは同じコンテナ内になければならない):いくつかの研究の後、今のコードは

    。これはもともとはプレースホルダでしたが、下記の提案を試していました。

  • テキストボックスを作成し、そのIDを設定します。
  • テキストボックスをパネルに追加します。
  • RequiredFieldValidatorを作成します。
  • ControlToValidateのIDを設定します。私が使用することを試みている値:

    • 制御
    • 制御
    • サーバーがWebユーザーコントロールの子コントロールに追加追加したテキストで始まるコントロールのIDのクライアントIDのID
    • クライアントIDは同じよう
    • (オフのチャンスに)コントロールの名前サーバがコントロール
    • の名前に追加したテキストで始まる制御の
    • 名を変更しました
  • 上記で詳述したように接頭辞で修飾された制御
  • の一意ID
  • をテキストボックスに新しい制御オブジェクトをキャストする試みに特注再帰的にFindControl方法を使用し、そのIDを使用してクライアントID
  • 同じ
  • バリデーターをパネルに追加します。
  • パネルをテーブルセルに追加します。

言うまでもなく、私はまだそれを検証することになっているコントロールを「見る」ためにバリデータを説得することができませんし、私が問題にアプローチする新しい方法のうち、完全だと言っています。

EDIT:page_loadイベントが終了するまで、さらに探偵的な仕事があっても、ページに問題はありません。ページを構築するコードの実行が終了した後、サーバーに問題があるようです。あまりにも早すぎるのではなく、あまりにも遅すぎると、実際にコントロールを名前付きコンテナに追加しているのかどうか疑問に思っています。

提案がありますか?

+0

PreInit()イベント中に動的コントロールが追加されていますか? –

+0

いいえ、そうではありません。どうして? –

+0

ちょうど私の2セント..ダイナミックに作成されたすべてのコントロールは、ポストバックで失われます。列挙を介していくつかのフィールドとボタンを動的に作成することができます。ボタンが存在し、クリックイベントを実行できるようにするには、 – foxtrotZulu

答えて

1

テキストボックスと2つのバリデータを含むユーザーコントロールの作成についてはどうですか?次に、いつものようにVisual StudioでControlToValidateを設定し、この新しいコントロールを動的にテーブルセルに動的に追加することができます。ここ

+0

興味深い考えですが、 "Textbox"はちょっとしたコントロールタイプのオプションの1つに過ぎません。セルに生息することができます。しかし、他のすべてが失敗した場合、私はこれを試してください。考えてくれてありがとう:) –

+0

予想通り、(実際に作業したのはこれがほぼ1週間後のことで、私はこれを書いたのですが!)賞賛とpgbへのupvote! –

+0

あなたはそれが働いていると聞いてうれしいです。 – pgb

0

は一例です:

は、ID =「PanelHolder」と、設計時に自分のページにPanelコントロールを追加します(またはあなたが動的に追加することができます)。

その後、動的にコントロールを作成し、このようにそのパネルに追加します:

var myTextbox = new TextBox() {ID="myTextBox"}; 
PanelHolder.Controls.Add(myTextBox); 
var validator = new RequiredFieldValidator() {ControlToValidate="myTextBox",Display=ValidatorDisplay.Dynamic,ErrorMessage="Required field"} 
PanelHolder.Controls.Add(validator); 
+0

私はそれを試しますが、これは基本的にプレースホルダを追加してコントロールを追加するのと同じではありませんか?そうでない場合は、どうしてですか? –

+0

これは問題を解決するものではありません。しかし、勇敢な努力。 –

0

質問だけのカップル:

  • が検証の原因となるバックページを掲示するのコントロールですか? (もしそうなら、それが別のバリデーショングループに含まれていないことを確認してください)

  • 妥当性確認は起こっていませんか?バリデータのErrorMessageプロパティを設定しないと、何もしていないと考えるのは簡単でしょう。 (と私はあなたがあなたのリスト上での設定を参照することはできません)

編集:

あなたはこのような何かをやっている場合:

 Panel pTest = new Panel(); 

     TextBox tb = new TextBox(); 
     for (int i = 0; i < 2; i++) 
     { 
      tb.ID = "tbDynamicTextBox" + i; 
      pTest.Controls.Add(tb); 
      RequiredFieldValidator rfv = new RequiredFieldValidator(); 
      rfv.ControlToValidate = tb.ID; 
      rfv.ErrorMessage = "Empty textbox"; 
      pTest.Controls.Add(rfv); 
     } 
     cell.Controls.Add(pTest); 

を次にあなたが得ますテキストボックスの1つのインスタンスだけがコントロールコレクションに追加されるため、エラーが発生します。 'TextBox tb = new TextBox();ループの内側の部分、それはうまくいくでしょう。

これが問題なのかどうかはわかりませんが、試してみる価値はあります。

+0

ページが最初に読み込まれません。だから私は確証は起こっていないと確信しています。コントロールの読み込みではポストバックは発生しません。 –

+0

ページが読み込まれない場合は、どうすればこの問題になると思いますか? – hunter

+0

ページが読み込まれない原因は、動的バリデーターをページのコントロールコレクションに追加しようとすると、検証対象となるテキストボックスを見つけることができず、ページがボークになりエラーメッセージが表示されるという事実ですロードする代わりに。これは私にとっては問題です。私は、ページ上に検証用のテキストボックスを読み込むようにします。 .Netエラーメッセージではありません。編集: –

1

私は似たような状況でリピーターを使用:

<table> 
<colgroup> 
    <col style="white-space: nowrap;" /> 
    <col /> 
    <col /> 
</colgroup> 
<asp:Repeater ID="InputFields" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <td class="labelCell"> 
       <asp:Label id="FieldName" runat="server" Font-Bold="True" Text='<%# Eval("Name") %>'></asp:Label>: 
      </td> 
      <td class="fieldCell"> 
       <asp:TextBox id="FieldData" runat="server" autocomplete="off" /> 
      </td> 
      <td class="errorCell"> 
       <asp:RequiredFieldValidator ID="FieldNameRequiredValidator" runat="server" CssClass="errorValidator" ErrorMessage='<%# Eval("Name") %> is required' 
        ControlToValidate="FieldData" Display="Dynamic">&nbsp;&nbsp;&nbsp;</asp:RequiredFieldValidator> 
       <asp:RegularExpressionValidator ID="FieldNameRegexValidator" runat="server" CssClass="errorValidator" ErrorMessage='A valid <%# Eval("Name") %> is required' 
        ControlToValidate="FieldData" Display="Dynamic" ValidationExpression='<%# Eval("RegEx") %>'>&nbsp;&nbsp;&nbsp;</asp:RegularExpressionValidator> 
      </td> 
     </tr> 
    </ItemTemplate> 
</asp:Repeater> 

をリピーターがFieldDataコントロールIDがコンテナ内で一意であることを保証し、「名前付けコンテナー」を作成します。

0

私はtexboxとグリッド内のそのtexboxのrequiredfieldバリデーターを生成します。

私が最初にこれは私がrequiredfieldバリデータのcontroltovalidateプロパティとしてtexboxのIDをgived、それはme.Theコードのために働いたより制御誤差 を見つけることができませんでしgived以下RegularExpressionValidatorを返すrequiredfieldバリデータ のcontroltovalidateプロパティとしてテキストボックスのクライアントIDを使用しようとしましたメソッドの第1引数として与えられたコントロールのために。

private RegularExpressionValidator GetRegValidator(string itemId, string regExp) 
    { 
     RegularExpressionValidator _regVal = new RegularExpressionValidator(); 
     _regVal.ControlToValidate = itemId; 
     _regVal.ValidationExpression = regExp; 
     _regVal.ErrorMessage ="PropertyRegexDoesNotMatches"; 
     _regVal.Text = "*"; 
     _regVal.SetFocusOnError = true; 
     _regVal.EnableClientScript = true; 
     _regVal.ID = string.Format("{0}Validator", itemId); 
     return _regVal; 
    } 
関連する問題