Pregunta

Tengo un requisito de añadir un RequiredFieldValidator y RegularExpressionValidator a un cuadro de texto creado dinámicamente en un TableCell generado dinámicamente, dentro de un control de usuario Web en el área de contenido de una página creada a partir de un Maestro.

El problema, como es fácil adivinar, está tratando de establecer dinámicamente la propiedad ControlToValidate para mirar mi cuadro de texto creado dinámicamente.

Después de algunas investigaciones ahora el código:

  • Crea un Panel (Como he oído la ControlToValidate y Validador deben estar dentro del mismo recipiente). Este fue originalmente un marcador de posición, pero estaba tratando una sugerencia que aparece a continuación.
  • Crea el cuadro de texto y establece su ID.
  • Añade el cuadro de texto para el Panel.
  • Crea el RequiredFieldValidator.
  • Establece el id de la ControlToValidate. Los valores que han intentado utilizar:

    • El ID del control
    • el ClientID del control
    • el ID del control prefijado por el texto añadido el servidor añade a los controles secundarios del control de usuario Web
    • el ID de cliente modificada de la misma manera
    • el nombre del control (por si acaso)
    • el nombre del control prefijado por el texto que el servidor añade a los nombres de los controles
    • utilizando un método recursivo FindControl medida en un intento de lanzar un nuevo objeto de control para cuadro de texto y a continuación, utilizando su ID y ClientID
    • el UniqueID del control
    • la misma modificada con el prefijo como se detalló anteriormente
  • Añadir el validador al panel.
  • Añadir el panel a la TableCell.

No hace falta decir que soy todavía incapaz de convencer al Validador de "ver" el control que se supone para validar y estoy completamente fuera de las nuevas formas de abordar el problema.

EDIT: Además trabajo de investigación me ha llevado hasta el punto de que la página no tiene un problema hasta que el evento Page_Load ha terminado. El servidor parece tener un problema después de que el código para la construcción de la página ha terminado de ejecutarse. Estoy empezando a preguntarse si en realidad estoy añadiendo los controles en nombrar contenedores demasiado tarde en lugar de demasiado pronto.

¿Alguna sugerencia?

¿Fue útil?

Solución

¿Qué pasa con la creación de un control de usuario que contiene el cuadro de texto y los dos validadores? A continuación, se puede establecer el ControlToValidate a través de Visual Studio, como de costumbre, y luego añadir dinámicamente este nuevo control a su TableCell dinámicamente.

Otros consejos

He utilizado un repetidor en una situación similar:

<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>

El repetidor crea un "contenedor de nombres" que asegura que el ID de control fielddata es único dentro del recipiente.

Este es un ejemplo:

Añadir un control Panel a su página en tiempo de diseño con el ID = "PanelHolder" (o puede añadir de forma dinámica).

a continuación, crear sus controles de forma dinámica y añadirlos a ese panel de la siguiente manera:

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

Sólo un par de preguntas:

  • es el control que está publicando la última página hace que la validación? (Si es así, asegúrese de que no está en un grupo de validación independiente)

  • ¿Estás seguro de que está ocurriendo ninguna validación? Si no se establece la propiedad ErrorMessage de los validadores que podría ser fácil pensar que no está haciendo nada. (Y no puedo verte de colocarlo en su lista)

Editar

Si estás haciendo algo como esto:

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

A continuación, obtendrá un error, ya que sólo una instancia del campo será añadido a la colección de controles. Si se mueve el 'Cuadro de texto tb = nuevo cuadro de texto (); 'Parte interior del bucle Tho, no habrá ningún problema.

No estoy seguro de si este es su problema, pero vale la pena intentarlo.

i genero un validador TexBox y requiredfield para que TexBox dentro de una cuadrícula.

La primera vez que trató de utilizar ClientId del cuadro de texto como propiedad ControlToValidate del validador requiredfield este gived incapaz de encontrar error de control de lo que gived Identificación de TexBox como propiedad ControlToValidate del validador requiredfield y fue trabajado para el código me.The continuación devuelve un RegularExpressionValidator para el control que gived como primer argumento para el método.

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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top