2009-09-10 30 views
21

Tengo un repetidor, en cada ItemTemplate del repetidor es una casilla de verificación asp: con un controlador de eventos OnCheckedChanged establecido. Las casillas de verificación tienen la propiedad AutoPostBack establecida en verdadero. Cuando se marca cualquiera de las casillas de verificación, el controlador de eventos se activa. Cuando se desactiva cualquiera, el controlador de eventos no se activa.Controlador de eventos OnCheckedChanged de asp: la casilla de verificación no se activa cuando la casilla de verificación está desactivada

¿Alguna idea de por qué el evento no se dispara y cómo puedo disparar? Gracias.

simplificado código repetidor:

<asp:Repeater ID="rptLinkedItems" runat="server">    
    <ItemTemplate>  
    <asp:CheckBox ID="chkLinked" runat="server" 
    Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" /> 
    </ItemTemplate>  
</asp:Repeater> 

La colección se une al repetidor de la siguiente manera:

protected override void OnPreRenderComplete(EventArgs e) 
     { 
      if (!Page.IsPostBack) 
      { 
       m_linkedItems = GetLinkedItems(); 
       rptLinkedItems.DataSource = GetLinkableItems(); 
       rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler 
         (rptLinkedItems_ItemDataBound); 
       rptLinkedItems.DataBind(); 
      } 

      base.OnPreRenderComplete(e); 
     } 

El controlador de eventos OnItemDataBound es el siguiente:

private void rptLinkedItems_ItemDataBound(Object sender, RepeaterItemEventArgs args) 
     { 
      if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem) 
      { 
       CategoryItem item = args.Item.DataItem as CategoryItem; 

       Literal litItemName = args.Item.FindControl("litItemName") as Literal; 
       CheckBox chkLinked = args.Item.FindControl("chkLinked") as CheckBox; 

       litItemName.Text = item.Text; 

       chkLinked.Checked = IsItemLinked(item); 
       chkLinked.AutoPostBack = true; 
       chkLinked.InputAttributes.Add("Value", item.Id.ToString()); 
      } 
     } 

El evento OnCheckedChanged controlador es el siguiente:

protected void chkLinked_CheckedChanged(Object sender, EventArgs args) 
{ 
      CheckBox linkedItem = sender as CheckBox; 
      Boolean itemState = linkedItem.Checked; 
      Int32 itemId = Int32.Parse(linkedItem.InputAttributes["Value"].ToString()); 
      DataAccessLayer.UpdateLinkedItem(m_linkingItem, Utilities.GetCategoryItemFromId(itemId), itemState); 
} 

P.S. Si alguien también me puede decir por qué rebaja no funciona correctamente para mí ...

+0

@ Jibberish: RE: tu PS No estabas haciendo lo correcto. ;) Intente abrir esta pregunta en modo de edición y vea qué cambios hice. Punto clave 4 espacios para prefijar código, que el editor le indica que debe hacer en el panel de la derecha. – AnthonyWJones

+0

Gracias Anthony, y lo siento, lo eché de menos en el editor. – Jason

Respuesta

16

Esto se debe a que la jerarquía de control (y las casillas de verificación en particular) no existen cuando ASP.NET ejecuta la parte Control events del ciclo de vida de la página ASP.NET, como las había creado en las etapas posteriores PreRender. Consulte ASP.NET Page Life Cycle Overview para obtener una descripción más detallada de la secuencia de eventos.

Me errar por el lado de la precaución para el consejo de @ bleeeah, para que estés asignar un valor a CheckBox.Checked dentro rptLinkedItems_ItemDataBound, que también haría que el controlador de eventos para ejecutar:


chkLinked.Checked = IsItemLinked(item); 

En cambio, mover:


if (!Page.IsPostBack) 
    { 
     m_linkedItems = GetLinkedItems(); 
     rptLinkedItems.DataSource = GetLinkableItems(); 
     rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler 
      (rptLinkedItems_ItemDataBound); 
     rptLinkedItems.DataBind(); 
    } 

En el manejador Page.Load evento.

+0

Gracias, Rabid. Lo han hecho además de volver a suscribirse al evento como se mencionó anteriormente y ahora todo funciona exactamente como se esperaba. – Jason

+0

No hay problema, ¿podría votar mi pregunta http://stackoverflow.com/questions/1368403? Estoy desesperado por algunos consejos :) – Rabid

5

intente volver a la suscripción al evento CheckChanged en su caso OnItemDataBound,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged); 
+1

Eso parece haber resuelto el problema, gracias. Aunque no tengo claro por qué, ¿alguien puede iluminarme? – Jason

+1

Funciona porque los controladores de eventos de los controles dinámicos deben estar conectados cada vez que se reconstruye la página. – Carl

+0

A menos que lo haga en Init, de esa manera el marco se ocupa de esto. –

2

Suscribirse al evento CheckChanged en su Page_Init .

33

Intente utilizar AutoPostBack="true" así:

<asp:CheckBox ID="chkLinked" runat="server" Checked="false" 
    OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/> 
+0

¡Gracias! En mi caso, solo está funcionando. – rukeba

+0

¡Buena solución, gracias por eso! +1 – Alex

+0

Muy bien, gracias;) –

0

tiene que definir eventhandler para la lista de control de comando elemento repetidor, a continuación, en el interior del elemento de mando repetidor, pasar por puntos de la lista y obtener elementos seleccionados.

En la página .aspx puede usar Ajax y actualizar el panel para disparar eventhandler, pero tenga en cuenta que debe definir scriptmanage fuera del repetidor.

// checklisk checkedchange eventhandler

protected void chkLinked_CheckedChanged(Object sender, EventArgs args) 
     { 
     } 

y elemento de elemento de comando repetidor: artículos y la lista de verificación // Iterar detectan comprueban

protected void Repeater1_ItemCommand(object sender, RepeaterCommandEventArgs e) 
    { 
     CheckBoxList cbl = (CheckBoxList)e.Item.FindControl("CheckBoxList1"); 
     cbl.SelectedIndexChanged += new EventHandler(chkLinked_CheckedChanged); 

     string name = ""; 
     for (int i = 0; i < cbl.Items.Count; i++) 
     { 
      if (cbl.Items[i].Selected) 
      { 
       name += cbl.Items[i].Text.Split(',')[0] + ","; 
      } 
     } 
    } 
3

Uso AutoPostBack="true" así:

<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true" 
    Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" /> 
+0

Gracias, esto me ayudó :) –

Cuestiones relacionadas