En cliquant sur la case causes onCheckedChanged à feu à deux reprises
J'ai un GridView avec un TemplateField avec une case à cocher. Mon objectif est de capturer l'événement onclick l'aide de autopostback et la définition d'une base de données drapeau. Mon seul problème est que l'événement se déclenche deux fois. La première fois que la Case (Dans le paramètre sender) détient les cliqué valeur alors je l'ai mis en fonction sur le clic. La deuxième fois, le paramètre sender a une case à cocher qui est toujours vérifié=false. Je suis heureuse de vous divertir suggestions sur d'autres approché pour la résolution de ce problème, mais mon objectif est de définir une base de données basée sur l'indicateur sur l'utilisateur en cochant une case. Je suis ciblage .NET Framework 2.0.
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>
Ici est le gestionnaire d'événement dans le code-behind:
protected void ChangeReadFlag(object sender, EventArgs e)
{
if (RouteGridView.SelectedIndex != -1)
{
CheckBox cb = ((CheckBox)sender);
DataKey key = RouteGridView.SelectedDataKey;
//... do stuff here ...
}
}
- Vous pourriez avoir à publier plus de votre code pour obtenir une réponse
- Cela peut être sans rapport, mais il y a un bug dans le navigateur, si un <img> tag ne spécifie pas de src. puis deux requêtes sont faites
Vous devez vous connecter pour publier un commentaire.
Pouvez-vous définir le statut vérifié de la case à faux à tous de votre événement de chargement de page?
Il pourrait y avoir plusieurs raisons pour un tel comportement. Dans mon cas, c'était que l'événement a été enregistré deux fois:
une fois automatiquement comme une partie de la case à cocher définition
<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 - explicite de l'enregistrement quelque part dans le code, généralement dans la méthode OnInit:
CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);
Afin de résoudre ce problème, vous devez supprimer le second enregistrement, soit à partir du code de derrière ou de votre contrôle.
Vous voulez capturer la même de la GridView; identifier la commande (l'expéditeur) qui est à l'origine de la publication, et ensuite, vous pouvez exécuter votre base de données mise à jour.
L'une des raisons(il peut y en avoir d'autres) le problème vient est l'événement est enregistré deux fois.
Vérifier votre Code dans le code derrière, à l'intérieur de "InitializeComponent". Ce sera la cause de l'événement pour être enregistrée deux fois, et donc le feu à deux reprises.
Vous avez besoin de l'enlever à un endroit à résoudre le problème.
rAm.
Un autre problème potentiel est là que votre liaison de données qui se passe - je ne vois pas une source de données dans votre code en avant, donc je suppose que vous êtes la liaison de données dans le code-behind.
Si vous faites la databind sur la publication, et après le premier événement onChange a mis le feu, il est fort probable que l'événement databind est réinitialisation de la case de l'état, et ce qui a provoqué l'événement à feu nouveau.