net event checkedchanged change asp c# asp.net events checkbox oncheckedchanged

c# - event - Hacer clic en la casilla de verificación hace que se activeCheckedChanged para disparar dos veces



oncheckedchanged javascript (5)

Tengo un GridView con un TemplateField con una casilla de verificación. Mi objetivo es capturar el evento onclick utilizando autopostback y establecer un indicador de base de datos. Mi único problema es que el incendio del evento es dos veces. La primera vez La casilla de verificación (en el parámetro del remitente) contiene el valor cliqueado, así que lo configuré en función del clic. La segunda vez que el parámetro del remitente tiene una casilla de verificación que siempre está marcada = falso. Me complace recibir sugerencias sobre otros abordados para resolver este problema, pero mi objetivo es establecer un indicador de base de datos basado en que el usuario marque una casilla de verificación. Me estoy enfocando en .NET Framework 2.0.

Aquí está el código asociado:

<div style="margin-left : 1em;margin-right:1em;"> <asp:GridView ID="RouteGridView" runat="server" AllowPaging="True" AutoGenerateColumns="False" CellPadding="4" DataKeyNames="ROUTE_NUMBER" ForeColor="#333333" GridLines="None" style="width:100%;" onselectedindexchanged="RouteGridView_SelectedIndexChanged" AllowSorting="True" onpageindexchanging="RouteGridView_PageIndexChanging" onsorting="RouteGridView_Sorting" > <Columns> <%-- Column one --%> <asp:TemplateField HeaderText="Route" SortExpression="ROUTE_NUMBER"> <ItemTemplate> <asp:LinkButton ID="HyperLink1" runat="server" CommandName="Select" CommandArgument=''<%#Eval("ROUTE_NUMBER")%>'' Text=''<%# Eval("ROUTE_NUMBER") %>'' ></asp:LinkButton> </ItemTemplate> <ItemStyle HorizontalAlign="Center" /> </asp:TemplateField> <%-- Column 2 this is where the problem CheckBox is--%> <asp:TemplateField HeaderText="Read?" SortExpression="READ_FLAG"> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" OnCheckedChanged="ChangeReadFlag" AutoPostBack="true" Checked=''<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>'' Enabled=''<%# isSelectedRow(Container) %>'' /> </ItemTemplate> <ItemStyle HorizontalAlign="Center" /> </asp:TemplateField> <%-- more columns --% <%-- more columns --%> </Columns> </asp:GridView>

Aquí está el controlador de eventos del código detrás:

protected void ChangeReadFlag(object sender, EventArgs e) { if (RouteGridView.SelectedIndex != -1) { CheckBox cb = ((CheckBox)sender); DataKey key = RouteGridView.SelectedDataKey; //... do stuff here ... } }


Desea capturar el par de GridView; identifique el comando (remitente) que está causando la devolución de datos, y luego puede ejecutar su actualización de base de datos.


¿Establece el estado verificado de la casilla de verificación en falso en su evento de carga de página?


Una de las razones (puede haber otras) el problema es que el evento se registra dos veces.

Verifique su Código en el código que está detrás, dentro de "InitializeComponent". Esto hará que el evento se registre dos veces y, por lo tanto, se dispare dos veces.

Debes eliminarlo en un lugar para resolver el problema.

RAM.


Otro problema potencial es donde su enlace de datos está sucediendo: no veo un DataSource en su código en el frente, así que supongo que es un enlace de datos en el código subyacente.

Si está realizando el enlace de datos en la devolución de datos, y después de que se haya disparado el primer evento onChange, es muy probable que el evento de enlace de datos esté restableciendo el estado de la casilla de verificación y cause que el evento vuelva a iniciarse.


Puede haber varias razones para tal comportamiento. En mi caso, fue que el evento se estaba registrando dos veces: una vez automáticamente como parte de la definición de la casilla de verificación
<asp:CheckBox ID="CheckBox1" runat="server" **OnCheckedChanged="ChangeReadFlag"** AutoPostBack="true" Checked=''<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>'' Enabled=''<%# isSelectedRow(Container) %>'' />

y la segunda vez: un registro explícito en algún lugar del código, generalmente en el método OnInit:
CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);

Para solucionarlo, debe eliminar el segundo registro del código que está detrás o de su control.