Почему не происходит событие GridView SelectedIndexChanged? - PullRequest
2 голосов
/ 02 декабря 2011

У меня есть GridView, который вы можете щелкнуть по строке, и он должен вызвать метод SelectedIndexChanged (который обновляет другую часть страницы в зависимости от того, какая строка была выбрана). Я сделал что-то похожее на это раньше, и это сработало, но я не могу заставить часть SelectedIndexChanged вызываться по какой-то причине.

Страница удерживается на главной странице, которая имеет тег form runat="server" и тег <asp:ScriptManager>

Я использую e.Row.Attributes.Add("onclick", ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex)), чтобы позволить SelectedIndexChanged стрелять, щелкая в любом месте строки.

Чтобы проверить, что код работает отдельно от этого, я добавил CommandField с SelectButton, и он успешно срабатывает, но я бы предпочел найти решение, не используя его.

код ниже - любая помощь будет оценена. Спасибо

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 (который никогда не срабатывает):

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

Ответы [ 3 ]

4 голосов
/ 02 декабря 2011

Вам не нужен столбец CommandField, определенный как SelectButton?Тогда ваша разметка будет выглядеть примерно так:

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

Вы не спрашивали об этом, но я всегда чувствую необходимость упомянуть такие вещи как:

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

Этозапах кода.Это не плохо , но смешивать атрибуты JavaScript с кодом VB / C # - привычка, которую вы должны вырвать из этой ситуации.Если вам нужно сделать что-то подобное, добавьте свойство CssClass в свой GridView и определите эти действия в CSS (или JavaScript / jQuery, если в CSS недостаточно событий).


Редактировать:

Исходя из нашего обсуждения в комментариях, это выглядит как несоответствие способу изменения GridView.Это может быть связано с жизненным циклом страницы / события (как-то слишком поздно для ASP.NET правильно подключать события?), И вам лучше всего перейти с SelectedIndexChanged на SelectedIndexChanging.

1 голос
/ 31 августа 2012

Я боролся с той же проблемой ...

Это может не сработать в вашем сценарии (или вообще не годится), но попробуйте установить EnableEventValidation="false" для страницы. Это была разница для меня. Работал с использованием событий SelectedIndexChanged или SelectedIndexChanging, как указано выше.

0 голосов
/ 03 июля 2012

Используйте это:

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