4 votes

L'événement OnCheckedChanged ne se déclenche pas lorsque les cases à cocher du répéteur sont cochées.

Je suis un développeur relativement nouveau, et je ne fais ce métier que depuis environ 6 mois à temps plein. Je vous remercie donc par avance de lire et/ou de répondre à ma question.

J'ai un répéteur de données. À l'intérieur de ce répétiteur, j'ai une grille, un SQLDS et deux cases à cocher. Les deux cases à cocher ont un événement OnCheckedChanged et AutoPostback est réglé sur true. Le répéteur a également un événement OnItemDataBound.

Voici un exemple de la façon dont mon code est disposé :

    <asp:Repeater ID="Repeater1" OnItemDataBound="Repeater1_ItemDataBound">
        <ItemTemplate>
            <asp:Panel>
                <asp:UpdatePanel>
                    <ContentTemplate>
                        <asp:Checkbox ID="Checkbox1" Autopostback="True" OnCheckedChanged="CheckBox1_CheckedChanged">
                        <asp:Checkbox ID="Checkbox2"Autopostback="True" OnCheckedChanged="CheckBox2_CheckedChanged">
                        <asp:Gridview ID="Gridview1" DataSourceID="SqlDataSource1">
                        <asp:SQLDataSource ID="SQLDataSource1" SelectCommand="SP1" SelectCommandType="StoredProcedure">
                    </ContentTemplate>
                </asp:UpdatePanel>
            </asp:Panel>
        </ItemTemplate>
    </asp:Repeater>

Et le C#

    protected void Checkbox1_CheckedChanged(object sender, EventArgs e)
    {
        if (Checkbox1.Checked == true)
            {
                if (Checkbox2.Checked == true)
                    SqlDataSource1.SelectCommand = "SP1";
                else
                    SqlDataSource1.SelectCommand = "SP2";
            }
            else
                SqlDataSource1.SelectCommand = "SP3";
    }
    protected void Checkbox2_CheckedChanged(object sender, EventArgs e)
    {
        if (Checkbox2.Checked == true)
            {
                if (Checkbox1.Checked == true)
                    SqlDataSource1.SelectCommand = "SP3";
                else
                    SqlDataSource1.SelectCommand = "SP2";
            }
            else
                SqlDataSource1.SelectCommand = "SP1";
    }

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        //Uses FindControl to Databind the GV and hides it if GV.Rows.Count==0
    }

Je fais tout cela dans un TabPanel AJAX. J'ai une autre page où ce code fonctionne parfaitement, mais ce n'est pas à l'intérieur d'un répétiteur sur cette autre page.

Essentiellement, j'ai une page qui se charge avec une grille, et les deux cases à cocher changent le contenu de la grille. Le problème que j'ai, c'est que lorsque vous décochez la case (elles sont cochées au départ), elle 1. Se vérifie à nouveau et 2. Ne déclenche pas l'événement CheckedChanged.

Toute aide serait grandement appréciée.

3voto

AVD Points 57984

Vous devez définir AutoPostBack=True pour les cases à cocher, ainsi que l'enregistrement et l'affectation des gestionnaires d'événements de tous les contrôles ajoutés à l'UpdatePanel par le biais de l'attribut Triggers du contrôle UpdatePanel.

3voto

RockiesMagicNumber Points 372

L'Autopostback sur les cases à cocher fait que la SQLDatasource revient à la procédure stockée d'origine, lorsqu'elle atteint le chargement de la page et ignore les événements oncheckchanged.

Ce que j'ai fait, c'est que j'ai pris tous mes événements de liaison de données dans le pageload et je les ai placés à l'intérieur d'un fichier de type if (!IsPostBack) de sorte que, lorsque le retour automatique se produit, il ne lie pas à nouveau le SQLDS à la valeur originale.

De cette façon, lorsque le retour automatique se produit, il n'y a rien à faire, et il déclenche les événements OnCheckedChanged comme il est censé le faire.

Merci à tous d'avoir lu et répondu.

1voto

Agamand The True Points 484

ASP.NET Repeater possède un événement qui provoque un aller-retour du client. Cet événement s'appelle ItemCommand. Consultez ce lien :- http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemcommand.aspx

J'espère que cela vous aidera

1voto

MohD Points 1060

0voto

James Johnson Points 29414

D'abord, vous devez apporter le UpdatePanel à l'extérieur du répéteur, et ajoutez runat="server" . Vous devez également amener le contrôle de la source de données en dehors du répéteur et le réutiliser pour tous les GridViews à l'intérieur du répéteur.

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
                <!-- checkboxes -->
                <!-- gridview -->
            </ItemTemplate>
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ...>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X