为什么我的GridView的SelectedIndexChanged事件没有触发?

3
我有一个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>

代码后台:

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 (which never fires):

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

4

你不需要定义一个名为SelectButtonCommandField列吗?那么,你的标记将类似于:

<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中定义这些操作(或者如果CSS的事件不够多,也可以使用JavaScript/jQuery)。
编辑:

根据我们在评论中的讨论,这似乎与GridView的修改方式不一致有关。它可能与页面/事件生命周期有关(某种程度上说,ASP.NET太晚了,无法适当地连接事件?),你最好切换到SelectedIndexChanging事件。


我试图避免真正使用按钮选择行,这就是为什么我在上面两个属性之下添加了额外的属性(感谢您分解代码的建议 - 我会做到的)。 e.Row.Attributes.Add("onclick", ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex)) 这一行应该可以使gridview无需commandfield。 你怎么想? - jdtaylor
刚刚添加了按钮,当使用它时,SelectedIndexChanged事件会触发。我以前使用过onclick属性,它可以正常工作,所以不确定为什么这次不能用。 - jdtaylor
没问题。我在大学的时候辅修了英语,所以现在必须要好好利用一下这个教育背景。 :) 你添加的按钮生成的 JavaScript 是否与你在代码后台为该行构建的内容相匹配? - jwheron
是的,它匹配上了。我尝试删除它,以查看是否有问题,但并没有产生任何差异。 - jdtaylor
如果删除对 saveScrollPosition(); 的调用,它是否能正常工作?我刚刚在我的一个项目中尝试了一下,在 Firefox 8.0 中它可以正常工作。也许这也是一个浏览器问题? - jwheron
显示剩余7条评论

1

我一直在解决同样的问题...

这可能不适用于您的情况(或根本不是好事),但请尝试为页面设置EnableEventValidation="false"。这对我很有帮助。可以使用上述提到的SelectedIndexChangedSelectedIndexChanging事件。


0
使用这个:
e.Row.Attributes["onclick"]=ClientScript.GetPostBackEventReference(this.grvDetails,"Select$"+e.Row.RowIndex.ToString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接