manipulador de eventos OnCheckedChanged de asp: checkbox não dispara quando caixa de seleção é desmarcada

StackOverflow https://stackoverflow.com/questions/1404528

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho um repetidor, em cada ItemTemplate do repetidor é um asp: caixa com um conjunto de manipulador de eventos OnCheckedChanged. As caixas têm a propriedade AutoPostBack definido como verdadeiro. Quando qualquer uma das caixas de seleção estiver marcada, o incêndios manipulador de eventos. Quando qualquer estiver desmarcada, o manipulador de eventos não dispara.

Qualquer idéia de por que o evento não faz fogo, e como eu mgiht torná-lo disparar? Obrigado.

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>

A coleção é ligado ao repetidor da seguinte forma:

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

O manipulador de eventos OnItemDataBound é o seguinte:

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

O manipulador de eventos OnCheckedChanged é o seguinte:

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. Se alguém pode também dizer-me porque remarcação não funciona corretamente para mim ...

Foi útil?

Solução

Isso ocorre porque a hierarquia de controle (e as caixas de seleção em particular) não existem quando ASP.NET executa a parte Control events do ciclo de vida da página ASP.NET, como você os tivesse criado nos estágios PreRender posteriores. Por favor, consulte ASP.NET de vida da página Visão Geral do Ciclo para visão mais detalhada do sequência de eventos.

eu errar do lado da cautela para @ de bleeeah conselho, para que você está atribuindo um valor a CheckBox.Checked dentro rptLinkedItems_ItemDataBound, o que também causa o manipulador de eventos para executar:


chkLinked.Checked = IsItemLinked(item);

Em vez disso, move:


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

Dentro do manipulador de eventos Page.Load.

Outras dicas

Tente usingAutoPostBack="true" assim:

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

Tente re-assinando o evento CheckChanged em seu evento OnItemDataBound,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

Use AutoPostBack="true" assim:

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

Inscrever-se para o evento CheckChanged em sua Page_Init.

Você tem que definir eventhandler para a lista de comandos item de repetidor, em seguida, no interior do comando item de repetidor, percorrer itens da lista de verificação e obter itens marcados.

Na página .aspx você pode usar Ajax e updatepanel para eventhandler fogo, mas tenha em mente que você tem que definir fora scriptmanage de repetidor.

// checklisk checkedchange eventhandler

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

e item de item de comando repetidor: // itens da lista de verificação ITERATE e detectar verificados

    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] + ",";
            }
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top