3

我需要将RequiredFieldValidator 和RegularExpressionValidator 添加到动态生成的tablecell 中的动态创建的文本框中,该文本框位于从Master 创建的页面的内容区域中的Web 用户控件内。

正如您可能猜到的那样,问题在于尝试动态设置 ControlToValidate 属性以查看我动态创建的文本框。

经过一番研究,现在的代码:

  • 创建一个面板(我听说 ControlToValidate 和 Validator 必须在同一个容器中)。这最初是一个占位符,但正在尝试下面列出的建议。
  • 创建文本框并设置其 ID。
  • 将文本框添加到面板。
  • 创建RequiredFieldValidator。
  • 设置 ControlToValidate 的 ID。我尝试使用的值:

    • 控件ID
    • 控件的 ClientID
    • 以服务器附加到 Web 用户控件的子控件的添加文本为前缀的控件 ID
    • 客户端 ID 以相同方式修改
    • 控件的名称(有机会)
    • 以服务器添加到控件名称的文本为前缀的控件名称
    • 使用定制的递归 FindControl 方法尝试将新的 Control 对象转换为 Textbox,然后使用其 ID 和 ClientID
    • 控件的 UniqueID
    • 与上面详述的前缀相同的修改
  • 将验证器添加到面板。
  • 将面板添加到表格单元中。

不用说,我仍然无法说服验证器“看到”它应该验证的控件,而且我完全没有解决问题的新方法。

编辑:进一步的侦探工作使我发现在 page_load 事件完成之前页面没有问题。构建页面的代码执行完毕后,服务器似乎出现了问题。我开始怀疑我是否真的将控件添加到命名容器中太晚了,而不是太早了。

有什么建议么?

4

5 回答 5

1

创建一个包含文本框和两个验证器的用户控件怎么样?然后你可以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

我为网格内的那个 texbox 生成一个 texbox 和 requiredfield 验证器。

我首先尝试使用 textbox 的 clientID 作为 requiredfield 验证器的 controltovalidate 属性,这给出了无法找到控件错误,而不是我将 texbox 的 ID 作为 requiredfield 验证器的 controltovalidate 属性,它对我有用。下面的代码返回一个 RegularExpressionValidator 用于给出的控件方法的第一个参数。

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 回答
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);

然后你会得到一个错误,因为只有一个文本框实例将被添加到控件集合中。如果您移动 ' TextBox tb = new TextBox(); ' 部分在循环里面,它会没事的。

我不确定这是否是您的问题,但值得一试。

于 2009-05-14T12:02:56.620 回答