.net - example - custom event c#




Controlador de eventos no activado para controles creados dinámicamente (8)

... como otra sugerencia, ¿no son eventos vinculantes después de que Page_Load sea demasiado tarde? y por lo tanto, no serán despedidos en la devolución. tal vez algo para ver ...

Tengo este problema con TextBox creado dinámicamente.

Cuando el TextBox se crea en PageLoad, se desencadena el evento TextChanged.
Pero cuando eliminé dinámicamente y recreé el TextBox, el TextChanged no se activó.

Este es el código:

archivo .aspx

<body>
    <form id="form1" runat="server">
    <div>

    <asp:Table ID="Table1" runat="server">
      <asp:TableRow>
        <asp:TableCell ColumnSpan="2">Fixed content</asp:TableCell>
      </asp:TableRow>
    </asp:Table>   
    </form>
</body>

archivo .cs

public partial class test : System.Web.UI.Page
{
  string myText = "a";

  protected void Page_Load(object sender, EventArgs e)
  {
    WriteRows();
  }

  private void WriteRows()
  {
    TableRow tr = new TableRow();

    TableCell tc = new TableCell();
    TextBox txt = new TextBox();
    txt.Text = myText;
    txt.TextChanged += new EventHandler(txt_TextChanged); // Assign event handler
    tc.Controls.Add(txt);
    tr.Controls.Add(tc);

    tc = new TableCell();
    tc.Text = txt.Text;
    tr.Controls.Add(tc);

    Table1.Controls.AddAt(1, tr);
  }

  private void txt_TextChanged(object sender, EventArgs e)
  {
    myText = ((TextBox)sender).Text;
    RedrawTable(); // Delete the row (incl. the TextBox) and rewrite it
  }

  private void RedrawTable()
  {
    Table1.Controls.RemoveAt(1);
    WriteRows();
  }
}

¿Alguien tiene una solución para que el evento siempre se dispare?


Cuando estaba investigando este tema, estaba en el contexto de los menús dinámicos, y hay un montón de respuestas de Google que, juntas, me ayudaron a superarlo (porque es un requisito bastante común, supongo). No tengo un resumen de la respuesta, pero podría ser un lugar útil para comenzar (es decir, google for Dynamic Menus .NET). Hay varias preguntas aquí en este sitio también.


Intenta crear los controles en el método Page_Init () ...


Tuve un problema similar. Creo que el problema es que los controles creados dinámicamente no se mantienen en estado de visualización y no sobreviven a una devolución de datos. Aquí hay un comentario extraído de mi código que describe la solución que se me ocurrió (puede que no sea la única, pero funcionó para mí).

Esta página se usa para definir una grilla dinámicamente. El usuario hace clic en casillas de verificación para indicar qué campos incluir en la grilla. La lógica de esta página hace dos cosas esenciales:

(1) Mantiene el objeto GridDefinition que se guarda en ViewState. (2) Reconstruye los controles agregados programáticamente (esencialmente todo en el objeto de la tabla) de GridDefinition en ViewState en cada devolución de datos. Los controles añadidos dinámicamente NO se vuelven a crear en la devolución de datos desde ViewState. De hecho, descubrí que si no recreas los controles, sus eventos no se dispararán. Aparentemente:

       "The process that matches controls to posted values occurs 
       after page_load completes, so it has to occur just like this 
       if you are to use this way."

Cuando recibo un evento de control que indica algún cambio en los datos, tengo que reflejar ese cambio en el objeto GridDefinition almacenado en ViewState. De esta forma, en la devolución de datos SIGUIENTE, el control puede recrearse correctamente (por ejemplo, un cuadro de texto que indica el texto del encabezado para una columna de cuadrícula).


para que se desencadene un evento de devolución de datos, el control que debe activar el evento debe estar disponible con el mismo ID y los mismos datos en el ciclo de vida de la devolución de datos .

Si tiene controles estáticos (definidos en su aspx / ascx / master) y viewstate encendidos, entonces se recrearán automágicamente.

Si no quiere usar viewstate, o usa controles dinámicos, necesita los controles de enlace de datos en cada page_load , para que los controles estén activos y ejecutándose a tiempo para que los eventos se disparen (sucede después de la carga de página)

si cambia la ID de un control principal o página, puede descartar involuntariamente el autobind de viewstate, ya que los ID de control contienen ID de ancestros. Creo que deberías estar seguro haciendo eso, siempre y cuando lo hagas en Page_Init (antes de que viewstate esté configurado)


Vuelva a crear controles creados dinámicamente en Page_Init. No tendrá acceso a los datos de viewstate de un control si lo vuelve a crear en Page_Load (viewstate se carga en PreLoad, lo que ocurre antes de Page_Load).

Además, no olvide asignar una ID al control.


Su respuesta dada a continuación con todo el código:

string myText = "a";

protected void Page_Load(object sender, EventArgs e)
{
    WriteRows();
}

private void WriteRows()
{
    TableRow tr = new TableRow();

    TableCell tc = new TableCell();
    TextBox txt = new TextBox();
    txt.Text = myText;

    txt.ID = "txt1";

    txt.TextChanged += new EventHandler(txt_TextChanged); // Assign event handler

    txt.AutoPostBack = true;

    tc.Controls.Add(txt);
    tr.Controls.Add(tc);

    tc = new TableCell();
    tc.Text = txt.Text;
    tr.Controls.Add(tc);

   Table1.Controls.AddAt(0,tr);

}

private void txt_TextChanged(object sender, EventArgs e)
{
    myText = ((TextBox)sender).Text;
    RedrawTable(); // Delete the row (incl. the TextBox) and rewrite it
}

private void RedrawTable()
{
    Table1.Controls.RemoveAt(0);
    WriteRows();
}

Tuve el mismo problema, y ​​en mi caso txt.AutoPostBack = true fue lo que me perdí. El valor predeterminado es falso, fácil de olvidar.





events