Acceda a un cuadro de texto en C # que se crea sobre la marcha

Mi código genera un TextBox sobre la marcha en C # (page_load función). ¿Puedo acceder a él en el código más tarde? Me da un error de compilación y no parece funcionar. ¿Alguien puede verificar?

Código para problema adicional

aContent += "<table>";
aContent += "<tr><td>lablel </td><td style='bla blah'><input type='textbox' id='col-1' name='col-1'/></td></tr> ... 10 such rows here
</table>"

spanMap.InnerHtml = aContent;

Los contenidos se muestran correctamente, pero la iteración recusiva no devuelve el cuadro de texto. Lo estoy llamando así

 TextBox txt = (TextBox)this.FindControlRecursive(spanMap, "col-1");
 // txt = (TextBox) spanMapping.FindControl("col-1"); this does not work too
 if (txt != null)
 {
      txt.Text = "A";
 }

preguntado el 08 de noviembre de 11 a las 16:11

¿Podrías publicar el código que estás usando? -

¿Dónde está tu código? ¿Lo agregaste a los controles de la página? ¿Lo vuelve a agregar en cada devolución de datos? -

¿Cómo puede alguien verificar? publicar el código. -

Pregunto si es posible. Creo que la pregunta lo explica bien. No es mi código por cierto, alguien más lo escribió. -

Esta es una vieja pregunta, pero la primera del "cuadro de texto" no es cuadro de texto, es entrada html. Debe agregar el cuadro de texto, como Textbox nTxt = new Textbox (); nTxt.id = "col-1"; spanMap.Controls.Add (nTxt); -

2 Respuestas

Suponiendo que lo persiste correctamente, debería poder acceder a él en código subyacente utilizando el FindControl método. Dependiendo de dónde esté el control, es posible que deba buscar de forma recursiva a través de la jerarquía de control:

private Control FindControlRecursive(Control root, string id)  
{  
    if (root.ID == id) 
    {  
        return root;  
    }  

    foreach (Control c in root.Controls)  
    {  
        Control t = FindControlRecursive(c, id);  
        if (t != null)  
        {  
            return t;  
        }  
    }  

    return null;  
} 

Usar FindControlRecursive:

TextBox txt = this.FindControlRecursive(Page.Form, "TextBox1") as TextBox;
if (txt != null)
{
    string text = txt.Text;
}

Si aún no puede encontrarlo con el método anterior, asegúrese de que está creando el control durante después de cada devolución de datos, en algún lugar antes Page_Load, me gusta OnInit.

EDITAR

Creo que necesitas cambiar la forma en que agregas contenido al contenedor. En lugar de usar un <span>, Usaría un Panel, y en lugar de crear marcas, simplemente agregue controles al panel en el código subyacente:

TextBox txt = new TextBox();
txt.ID = String.Format("txt_{0}", Panel1.Controls.Count);
Panel1.Controls.Add(txt);    

respondido 08 nov., 11:23

Así que supongo que FindControl es mi única forma de acceder a él. No puedo acceder a él directamente. @sylence a continuación mencionó agregar una referencia, pero eso no está muy claro. - Hammad Khan

Si, definitivamente necesitas FindControl para acceder a un control dinámico. No puede acceder a él directamente. - James Johnson

Probé este código pero no funcionó. Mi html está en realidad dentro de un lapso. spanMap.InnerHtml = aContent;. Dentro hay una mesa y la mesa interior es mi cuadro de texto. Aunque necesitas cambiar as Textbox a TextBox( ...), en el segundo bloque de código. - Hammad Khan

Estoy confundido ... ¿cuál es el problema? El método anterior no debería tener ningún problema para atravesar el árbol. - James Johnson

He incluido código adicional en la pregunta. Simplemente no encuentra ningún elemento hijo excepto un control literal. También estoy usando masterpage, si eso hace alguna diferencia. Sin embargo, lo usé antes y funcionó (no este ejemplo en particular). - Hammad Khan

He aquí un ejemplo:

<%@ Page Language="C#" %>
<script type="text/C#" runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        var textBox = new TextBox();
        textBox.ID = "myTextBox";
        textBox.Text = "hello";
        Form1.Controls.Add(textBox);
    }

    protected void BtnTestClick(object sender, EventArgs e)
    {
        var textBox = (TextBox)Form1.FindControl("myTextBox");
        lblTest.Text = textBox.Text;
    }
</script>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <form id="Form1" runat="server">
        <asp:LinkButton ID="btnTest" runat="server" Text="Click me" OnClick="BtnTestClick" />
        <asp:Label ID="lblTest" runat="server" />
    </form>
</body>
</html>

respondido 08 nov., 11:21

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.