3

マスターから作成されたページのコンテンツ領域にあるWebユーザーコントロール内の動的に生成されたテーブルセルに動的に作成されたテキストボックスに、RequiredFieldValidatorとRegularExpressionValidatorを追加する必要があります。

問題は、おそらくご想像のとおり、動的に作成されたテキストボックスを表示するようにControlToValidateプロパティを動的に設定しようとしていることです。

いくつかの調査の後、今コードを:

  • パネルを作成します(私が聞いたように、ControlToValidateとValidatorは同じコンテナー内にある必要があります)。これは元々プレースホルダーでしたが、以下にリストされている提案を試みていました。
  • テキストボックスを作成し、そのIDを設定します。
  • パネルにテキストボックスを追加します。
  • RequiredFieldValidatorを作成します。
  • ControlToValidateのIDを設定します。私が使おうとした値:

    • コントロールのID
    • コントロールのClientID
    • サーバーがWebユーザーコントロールの子コントロールに追加する追加テキストのプレフィックスが付いたコントロールのID
    • クライアントIDも同じように変更されました
    • コントロールの名前(偶然に)
    • サーバーがコントロールの名前に追加するテキストが前に付いたコントロールの名前
    • 特注の再帰的FindControlメソッドを使用して、新しいControlオブジェクトをTextboxにキャストし、そのIDとClientIDを使用する
    • コントロールのUniqueID
    • 上記のようにプレフィックスで変更されたものと同じ
  • パネルにバリデーターを追加します。
  • パネルをテーブルセルに追加します。

言うまでもなく、バリデーターが検証することになっているコントロールを「見る」ようにバリデーターを説得することはまだできず、問題に取り組むための新しい方法から完全に外れています。

編集:さらなる探偵の仕事は、page_loadイベントが終了するまでページに問題がないという点に私を導きました。ページを構築するためのコードの実行が終了した後、サーバーに問題があるようです。私は実際にコントロールをネーミングコンテナに追加するのが早すぎるのではなく遅すぎるのではないかと考え始めています。

助言がありますか?

4

5 に答える 5

1

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

于 2009-05-14T11:54:49.493 に答える
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がコンテナー内で一意であることを保証する「ネーミングコンテナー」を作成します。

于 2009-05-14T12:38:46.797 に答える
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);
于 2009-05-14T11:56:48.177 に答える
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(); 'ループの内側の部分、それは大丈夫でしょう。

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

于 2009-05-14T12:02:56.620 に答える
0

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

私は最初にtextboxのclientIDをrequiredfieldvalidatorのcontroltovalidateプロパティとして使用しようとしましたが、これにより制御エラーを見つけることができませんでした。texboxのIDをrequiredfield validatorのcontroltovalidateプロパティとして指定した場合、それは機能しました。メソッドの最初の引数。

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;
    }
于 2009-09-01T13:43:05.277 に答える