2008-12-18 10 views
1

J'ai un GridView avec un TemplateField avec une case à cocher. Mon objectif est de capturer l'événement onclick à l'aide d'autopostback et de définir un indicateur de base de données. Mon seul problème est que le feu de l'événement est deux fois. La première fois que la case à cocher (dans le paramètre de l'expéditeur) contient la valeur cliquée, je l'ai définie en fonction du clic. La deuxième fois, le paramètre sender a une case à cocher toujours cochée = false. Je suis heureux de recevoir des suggestions sur d'autres approches pour résoudre ce problème, mais mon objectif est de définir un indicateur de base de données basé sur l'utilisateur en cochant une case. Je cible .NET Framework 2.0.Si vous cliquez sur la case à cocher, la fonction onCheckedChanged se déclenche deux fois

Voici le code associé:

<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> 

Voici le gestionnaire d'événements du code sous-jacent:

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

     //... do stuff here ... 
    } 
} 
+0

Vous devrez peut-être poster plus de votre code pour obtenir une réponse –

+0

Cela peut être sans rapport, mais il y a un bug dans le navigateur que si un tag ne spécifie pas un src. alors deux demandes sont faites –

Répondre

0

Vous voulez capturer la même du GridView; identifiez la commande (expéditeur) à l'origine de la publication, puis exécutez la mise à jour de la base de données.

1

Avez-vous défini l'état de la case cochée sur false dans votre événement de chargement de page?

+0

Ce serait mon pari. –

0

L'une des raisons (il peut y avoir d'autres) que le problème vient est que l'événement est enregistré deux fois.

Vérifiez votre code dans le code derrière, dans "InitializeComponent". Cela entraînera l'enregistrement de l'événement deux fois et donc le feu deux fois.

Vous devez l'enlever à un endroit pour résoudre le problème.

rAm.

1

Il peut y avoir plusieurs raisons à un tel comportement. Dans mon cas, ce fut que l'événement était enregistré deux fois: une fois automatiquement une partie de la définition de case à cocher
<asp:CheckBox ID="CheckBox1" runat="server" **OnCheckedChanged="ChangeReadFlag"** AutoPostBack="true" Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' />

et la deuxième fois - un enregistrement explicite quelque part dans le code, le plus souvent dans la méthode OnInit:
CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);

Afin de le réparer, vous devez supprimer le deuxième enregistrement soit du code derrière ou de votre contrôle.

0

Un autre problème potentiel réside dans le fait que votre connexion de données est en cours. Je ne vois pas de source de données dans votre code en avant, donc je suppose que vous faites une liaison de données dans le code-behind.

Si vous effectuez le databind en postback, et après le premier événement onChange, il est fort probable que l'événement databind réinitialise l'état de la case à cocher et provoque ainsi le déclenchement de l'événement.