3 votes

Pourquoi l'événement SelectedIndexChanged de mon GridView ne se déclenche-t-il pas ?

J'ai un GridView qui vous permet de cliquer sur une ligne et d'appeler la fonction SelectedIndexChanged (qui met à jour une autre partie de la page en fonction de la ligne sélectionnée). J'ai déjà fait quelque chose de similaire et cela a fonctionné, mais je n'arrive pas à faire en sorte que la méthode de mise à jour de la page soit utilisée. SelectedIndexChanged pour être appelé pour une raison quelconque.

La page est maintenue dans une page maître qui a une form runat="server" et une étiquette <asp:ScriptManager> étiquette

J'utilise e.Row.Attributes.Add("onclick", ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex)) pour permettre à la SelectedIndexChanged à déclencher en cliquant n'importe où sur la ligne.

Pour vérifier que le code fonctionne bien en dehors de cela, j'ai ajouté un CommandField avec un SelectButton et cela se déclenche avec succès, mais je préférerais trouver une solution sans avoir à utiliser cela.

Le code est ci-dessous - toute aide serait appréciée. Merci

GridView :

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
    <ContentTemplate>
        <asp:HiddenField runat="server" ID="hdnScrollPosition" />
        <asp:GridView ID="gridMessages" runat="server" CssClass="gridView" AutoGenerateColumns="False"
            AllowPaging="true" GridLines="None" PageSize="10" ShowHeader="True"
            EmptyDataText="--No Messages Received--" Width="100%">
            <Columns>
                <asp:TemplateField HeaderText="Messages Received" HeaderStyle-HorizontalAlign="Left" HeaderStyle-CssClass="headerClass">
                    <ItemTemplate>
                        ....
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

Code-Behind :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        Me.gridMessages.DataSource = ...
        Me.gridMessages.DataBind()
    End If
End Sub

Protected Sub gridMessages_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gridMessages.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#D2E6F8'")
        e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff'")

        e.Row.Attributes.Add("onclick", "saveScrollPosition(); " & ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex))

    End If
End Sub

SelectedIndexChanged (qui ne se déclenche jamais) :

Protected Sub gridMessages_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles gridMessages.SelectedIndexChanged
    Response.Redirect("test.aspx")
End Sub

4voto

jwiscarson Points 2152

N'avez-vous pas besoin d'une colonne CommandField défini comme un SelectButton ? Alors, votre balisage ressemblerait à quelque chose comme :

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
    <ContentTemplate>
        <asp:HiddenField runat="server" ID="hdnScrollPosition" />
        <asp:GridView ID="gridMessages" runat="server" CssClass="gridView" AutoGenerateColumns="False"
            AllowPaging="true" GridLines="None" PageSize="10" ShowHeader="True"
            EmptyDataText="--No Messages Received--" Width="100%">
            <Columns>
                <asp:CommandField ShowSelectButton="true" ButtonType="Button" />
                <asp:TemplateField HeaderText="Messages Received" HeaderStyle-HorizontalAlign="Left" HeaderStyle-CssClass="headerClass">
                    <ItemTemplate>
                        ....
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

Vous n'avez pas posé de question à ce sujet, mais je me sens toujours obligé de mentionner des choses comme ces deux lignes :

e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#D2E6F8'")
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff'")

C'est une odeur de code. Ce n'est pas une mauvais mais mélanger des attributs JavaScript avec du code VB/C# est une habitude dont vous devriez vous défaire dès maintenant. Si vous avez besoin de faire quelque chose comme ça, ajoutez une balise CssClass à votre GridView et définissez ces actions en CSS (ou en JavaScript/jQuery si CSS n'a pas assez d'événements pour vous).


Edita:

D'après notre discussion dans les commentaires, cela ressemble à une incohérence avec la façon dont le GridView peut être modifié. Il se peut que ce problème soit lié au cycle de vie de la page/des événements (d'une manière ou d'une autre, il est trop tard pour qu'ASP.NET accroche correctement les événements). SelectedIndexChanged à l'événement SelectedIndexChanging .

1voto

Stewart Points 50

Je me suis battu avec la même question...

Cela peut ne pas fonctionner dans votre scénario (ou ne pas être une bonne chose à faire du tout) mais essayez de définir EnableEventValidation="false" pour la page. C'est ce qui a fait la différence pour moi. Cela a fonctionné en utilisant soit SelectedIndexChanged o SelectedIndexChanging comme mentionné ci-dessus.

0voto

vijay Points 58

Utilisez ça :

e.Row.Attributes["onclick"]=ClientScript.GetPostBackEventReference(this.grvDetails,"Select$"+e.Row.RowIndex.ToString());

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