suscribirse los instanciar eventos evento ejemplos ejecutan como boton activar c# .net asp.net events postback

instanciar - eventos en c# ejemplos



¿Cómo puedo crear botones y conectar eventos desde la devolución de datos? (6)

¿Qué sucede cuando el manejo de eventos de devolución de datos intenta encontrar el control que no existe en la colección? Pago Denis DynamicControlsPlaceholder @ http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx

Espero que ayude a Bruno Figueiredo http://www.brunofigueiredo.com

Necesito generar botones inicialmente basados ​​en bastante procesador y búsqueda intensiva de disco. Cada botón representará una selección y activará una devolución de datos. Mi problema es que la devolución de datos no activa el comando b_Command. Supongo que porque los botones originales no se han vuelto a crear. No puedo permitir ejecutar la búsqueda original en la devolución de datos para volver a crear los botones, así que me gustaría generar el botón requerido de la información de devolución de datos.

¿Cómo y dónde debo estar haciendo esto? ¿Debo hacerlo antes de Page_Load por ejemplo? ¿Cómo puedo volver a construir CommandEventHandler desde la devolución de datos, en todo caso?

namespace CloudNavigation { public partial class Test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { // how can I re-generate the button and hook up the event here // without executing heavy search 1 } else { // Execute heavy search 1 to generate buttons Button b = new Button(); b.Text = "Selection 1"; b.Command += new CommandEventHandler(b_Command); Panel1.Controls.Add(b); } } void b_Command(object sender, CommandEventArgs e) { // Execute heavy search 2 to generate new buttons Button b2 = new Button(); b2.Text = "Selection 2"; b2.Command += new CommandEventHandler(b_Command); Panel1.Controls.Add(b2); } } }


¿Su ASPX tiene el controlador de eventos conectado?

<asp:Button id="btnCommand" runat="server" onClick="b_Command" text="Submit" />


Aquí hay una muestra con manejo de estado de vista personalizado (tenga en cuenta que los botones tienen EnableViewState = false ):

protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // Execute heavy search 1 to generate buttons ButtonTexts = new ButtonState[] { new ButtonState() { ID = "Btn1", Text = "Selection 1" } }; } AddButtons(); } void b_Command(object sender, CommandEventArgs e) { TextBox1.Text = ((Button)sender).Text; // Execute heavy search 2 to generate new buttons ButtonTexts = new ButtonState[] { new ButtonState() { ID = "Btn1", Text = "Selection 1" }, new ButtonState() { ID = "Btn2", Text = "Selection 2" } }; AddButtons(); } private void AddButtons() { Panel1.Controls.Clear(); foreach (ButtonState buttonState in this.ButtonTexts) { Button b = new Button(); b.EnableViewState = false; b.ID = buttonState.ID; b.Text = buttonState.Text; b.Command += new CommandEventHandler(b_Command); Panel1.Controls.Add(b); } } private ButtonState[] ButtonTexts { get { ButtonState[] list = ViewState["ButtonTexts"] as ButtonState[]; if (list == null) ButtonTexts = new ButtonState[0]; return list; } set { ViewState["ButtonTexts"] = value; } } [Serializable] class ButtonState { public string ID { get; set; } public string Text { get; set; } }


Estoy de acuerdo con Joel sobre el almacenamiento en caché de los resultados de búsqueda. En cuanto a los botones, puedes crearlos dinámicamente en las fases de inicio o carga del ciclo de vida de la página, pero ten en cuenta que si eliminas un botón y luego lo vuelves a agregar programáticamente, perderás tu estado.

En uno de mis proyectos, tenemos una forma dinámica que genera el campo son el vuelo y la forma en que lo hacemos funcionar es mediante una matriz que se almacena en el caché o en el estado de visualización de la página. La matriz contiene los botones para mostrar y en cada página cargada vuelve a crear los botones para que el estado se pueda cargar correctamente en ellos. Entonces, si necesito más botones o un conjunto completamente nuevo, marque el valor oculto en la matriz y agregue un nuevo conjunto de valores en la matriz para el nuevo conjunto de botones correspondientes. De esta forma, el estado no se pierde y los botones continúan funcionando.

También debe asegurarse de agregar un controlador para el evento on_click para sus botones si los crea programáticamente, lo que creo que veo en su código en la parte superior.


Los botones deben crearse antes del evento de carga, o el estado no se cableará correctamente. Vuelva a crear sus botones en Init () en su lugar.

En cuanto a cómo hacer esto sin volver a ejecutar la búsqueda, sugiero que almacene los resultados en algún lugar. La existencia de un conjunto de resultados en la memoria caché es cómo su código de botón en el evento Init () sabrá que necesita ejecutarse.

Alternativamente, puede colocar los botones en la página estáticamente. Simplemente coloque lo suficiente para manejar lo que devuelva la búsqueda. Si piensas que tal vez serían demasiados elementos, pregúntate a ti mismo: ¿tus usuarios realmente querrán clasificar tantos elementos? Quizás deberías considerar paginar estos datos, en cuyo caso los botones estáticos ya no son tan importantes.


El método del controlador de eventos b_Command no se está ejecutando porque los botones posteriores a la publicación no se están recreando (ya que se generan dinámicamente). Necesita volver a crearlos cada vez que se vuelva a crear su página, pero para hacer esto, necesita almacenar en caché explícitamente la información en algún lugar del estado.

Si la operación más fácil es almacenarla en el ViewState (como cadenas, si comienza a cargar el ViewState con objetos, verá que el rendimiento disminuirá) para que pueda verificarlo en la próxima carga (o cualquier otro evento) y volver a crear botones al volver a cargar la página. Si la operación tiene un ámbito de sesión, puede almacenar fácilmente un objeto (matriz o lo que sea) en sesión y recuperarlo en la siguiente carga (o Init) para volver a crear sus controles.

Este escenario significa que solo necesita almacenar información sobre su botón en su bCommand EventHandler en lugar de crear y agregar botones, ya que si lo hace, perderá información relativa en la siguiente devolución (como está sucediendo ahora).

para que tu código se convierta en algo así como:

namespace CloudNavigation { public partial class Test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { this.recreateButtons(); } else { // Execute heavy search 1 to generate buttons Button b = new Button(); b.Text = "Selection 1"; b.Command += new CommandEventHandler(b_Command); Panel1.Controls.Add(b); //store this stuff in ViewState for the very first time } } void b_Command(object sender, CommandEventArgs e) { //Execute heavy search 2 to generate new buttons //TODO: store data into ViewState or Session //and maybe create some new buttons } void recreateButtons() { //retrieve data from ViewState or Session and create all the buttons //wiring them up to eventHandler } } }

Si no desea llamar a recreateButtons en la carga de la página, puede hacerlo en PreLoad o en los eventos Init, no veo ninguna diferencia ya que podrá acceder a las variables ViewState / Session en todas partes (en Init viewstate no se aplica pero puede acceder a él para volver a crear sus botones dinámicos).

Alguien odiará esta solución, pero hasta donde yo sé, la única forma de retener los datos estatales del lado del servidor es ViewState - Session - Page.Transfer o las cookies del lado del cliente.