【问题标题】:Why doesn't my GridView SelectedIndexChanged event fire?为什么我的 GridView SelectedIndexChanged 事件没有触发?
【发布时间】:2012-01-11 14:51:17
【问题描述】:

我有一个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(从不触发):

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

【问题讨论】:

    标签: asp.net vb.net gridview selectedindex


    【解决方案1】:

    您不需要将列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 中定义这些操作(如果 CSS 没有足够的事件供您使用,则使用 JavaScript/jQuery)。


    编辑:

    根据我们在 cmets 中的讨论,这看起来与修改 GridView 的方式不一致。它可能与页面/事件生命周期有关(对于 ASP.NET 来说,正确连接事件是否为时已晚?),您最好的选择是从 SelectedIndexChanged 事件切换到 SelectedIndexChanging

    【讨论】:

    • 我试图避免必须实际使用按钮来选择一行,这就是为什么我在上面两个下面添加了额外的属性(感谢关于拆分代码的建议 - 会做那)。 e.Row.Attributes.Add("onclick", ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex)) 行应该可以工作,这样gridview就不需要命令字段。想法?
    • 嗯...我从来没有尝试过这样的事情。如果你没有创建按钮,我不确定 ASP.NET 会听什么(你可能是对的,没有按钮它可能工作得很好)。也许尝试创建按钮以确保您拥有正确的回发超链接内容?我认为,这将是一个很好的细节,可以编辑回原始问题。
    • 刚刚添加了按钮,并且 SelectedIndexChanged 在使用时触发。我之前使用过 onclick 属性并且它有效,所以我不确定为什么它不使用这个
    • 顺便说一句,感谢您对问题的调整,现在更有意义了!
    • 没问题。我在大学辅修英语,所以我必须以某种方式利用这种教育。 :) 您添加的按钮生成的 JavaScript 是否与您在代码隐藏中为行本身构建的内容相匹配?
    【解决方案2】:

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

    它可能不适用于您的场景(或者根本不是一件好事),但请尝试为页面设置EnableEventValidation="false"。这对我来说是不同的。如上所述,使用SelectedIndexChangedSelectedIndexChanging 事件工作。

    【讨论】:

      【解决方案3】:

      使用这个:

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

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 1970-01-01
        • 2010-10-03
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多