在Gridview中,下拉列表的SelectedIndexChanged事件没有触发!

5
我已经寻找解决方法有一段时间了,看到很多帖子向我展示如何做,但是当下拉列表改变时,我的SelectedIndexChanged事件仍无法触发。
DropDownList的AutoPostBack被设置为True,我也遵循了下面这篇帖子中的代码: 链接到帖子 以下是我的代码:
.ASPX
    <asp:GridView ID="gvCases" DataKeyNames="UserId" runat="server" AutoGenerateColumns="False" 
    BorderWidth="0px" CssClass="gridList" GridLines="None">
    <AlternatingRowStyle BackColor="#F7F7F7" />
    <Columns>

        <asp:BoundField DataField="id" HeaderText="Case Ref" />

        <asp:TemplateField HeaderText="Name">
            <ItemTemplate>
                <asp:Label ID="clientName" runat="server" Text="Label"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:BoundField DataField="company" HeaderText="Company" />

        <asp:TemplateField HeaderText="Order Date">
            <ItemTemplate>
                <asp:Label ID="dateTime" runat="server" Text="Label"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="Case Owner">
            <ItemTemplate>
                <asp:DropDownList ID="iconUsers" runat="server" OnSelectedIndexChanged="iconUsers_SelectedIndexChanged">
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:Button ID="btnDetails" runat="server" CausesValidation="False" Text="Details" />
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:Button ID="btnSchedule" runat="server" CausesValidation="False" Text="Schedule" />
            </ItemTemplate>
        </asp:TemplateField>



    </Columns>
</asp:GridView>

.VB

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


    If (Request.IsAuthenticated = False) Then
        Response.Redirect("~/admin/default.aspx")
    End If


    Dim keypadSQL As SqlConnection = New SqlConnection()
    keypadSQL.ConnectionString = ConfigurationManager.ConnectionStrings("connKeypad").ConnectionString()


    Dim cmdActive As SqlCommand = New SqlCommand()
    cmdActive.Connection = keypadSQL
    cmdActive.CommandText = "spCasesActive"
    cmdActive.CommandType = CommandType.StoredProcedure


    Dim daCases As SqlDataAdapter = New SqlDataAdapter
    daCases.SelectCommand = cmdActive

    Dim dsCases As DataSet = New DataSet()
    daCases.Fill(dsCases, "CaseList")

    Dim CaseTotal As Integer
    CaseTotal = dsCases.Tables(0).Rows.Count

    If CaseTotal = 1 Then
        iCaseTotal.InnerHtml = CaseTotal & " Case"
    Else
        iCaseTotal.InnerHtml = CaseTotal & " Cases"
    End If

    gvCases.DataSource = dsCases
    gvCases.DataBind()
    cmdActive.Dispose()


    If Page.IsPostBack Then

    End If

End Sub

Protected Sub gvCases_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvCases.RowDataBound

    If e.Row.RowType = DataControlRowType.Header Then

        gvCases.Columns(5).ItemStyle.Width() = "60"
        gvCases.Columns(6).ItemStyle.Width() = "70"

    End If

    If e.Row.RowType = DataControlRowType.DataRow Then

        Dim rowView As DataRowView = CType(e.Row.DataItem, DataRowView)

        Dim strClientName As String
        Dim clientName As Label
        strClientName = rowView("firstname") & " " & rowView("lastname")
        clientName = CType(e.Row.FindControl("clientName"), Label)
        clientName.Text = strClientName

        Dim strDateTime As String
        Dim dateTime As Label
        strDateTime = rowView("CaseSent")
        dateTime = CType(e.Row.FindControl("dateTime"), Label)
        dateTime.Text = FormatDateTime(strDateTime, DateFormat.ShortDate) & "<br />" & FormatDateTime(strDateTime, DateFormat.ShortTime)

        gvCases.Columns(3).ItemStyle.Font.Size = 8
        gvCases.Columns(5).ControlStyle.CssClass = "btnEdit"
        gvCases.Columns(6).ControlStyle.CssClass = "btnSchedule"

        Dim intUserId As String
        intUserId = Convert.ToString(gvCases.DataKeys(e.Row.RowIndex).Value)



        Dim cmd As New SqlCommand("SELECT id, Firstname, Lastname, Firstname + ' ' + Lastname As FullName FROM [users_icon] ORDER BY Firstname, Lastname", New SqlConnection(ConfigurationManager.ConnectionStrings("connKeypad").ConnectionString()))
        cmd.Connection.Open()

        Dim ddlValues As SqlDataReader
        ddlValues = cmd.ExecuteReader()

        Dim iconUsers As DropDownList
        iconUsers = CType(e.Row.FindControl("iconUsers"), DropDownList)
        iconUsers.Style.Add("font-size", "11px")
        iconUsers.DataSource = ddlValues
        iconUsers.DataValueField = "id"
        iconUsers.DataTextField = "FullName"
        iconUsers.DataBind()

        Dim ListItem1 = New ListItem("Select Case Owner", "0")
        iconUsers.Items.Insert("0", ListItem1)
        iconUsers.AutoPostBack = True
        If IsDBNull(rowView("CaseOwner")) Then
            iconUsers.SelectedValue = 0
        Else
            iconUsers.SelectedValue = rowView("CaseOwner")
        End If

        AddHandler iconUsers.SelectedIndexChanged, AddressOf iconUsers_SelectedIndexChanged

        cmd.Connection.Close()
        cmd.Connection.Dispose()


        Dim btnDetails As Button = CType(e.Row.FindControl("btnDetails"), Button)
        btnDetails.PostBackUrl = "~/admin/detail.aspx?uid=" & intUserId

        Dim LabelAddress As Button = CType(e.Row.FindControl("btnSchedule"), Button)
        LabelAddress.PostBackUrl = "~/admin/schedule.aspx?uid=" & intUserId

    End If

End Sub

Protected Sub iconUsers_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

    Response.Write("Function Called")

End Sub

感谢您的帮助。 J.

是的,在gvCases_RowDataBound中 - iconUsers.AutoPostBack = True。 - Jammer
ViewState 启用还是禁用? - Jeff
在GridView和DropDownMenu上设置为继承,应该只需将页面设置为默认值,所以我猜这是启用的!? - Jammer
2个回答

6
有一些类似的问题(请参见使用AddHandler时事件处理程序未触发在Repeater控件中为自定义控件分配事件),但你的情况看起来像是你在标记中和数据绑定中都添加了处理程序。我会删除RowDataBound事件中的一个处理程序(因为它没有做任何事情,因为当你进行提交后,处理程序将丢失,并且处理程序是在实际触发事件之后添加的)。此外,请确保像@Bala所提到的那样设置AutoPostBack。

1
我稍微修改了我的代码,将事件处理程序和自动回发从代码后端移除并放到了我的.ASPX文件中 - <asp:DropDownList ID="iconUsers" runat="server" OnSelectedIndexChanged="iconUsers_SelectedIndexChanged" AutoPostBack="true">,但它仍然没有触发 :(,我真的卡住了。 - Jammer
所以页面正在回传,您正在进行调试,但是它从未触发您在iconUsers_SelectedIndexChanged处设置的断点? - Ian Pugsley
是的,Ian说得对,当我更改其中一个下拉列表时,它从未到达断点。 - Jammer
2
啊 - 看起来你在每一行上重新绑定了每个下拉列表(即使在 postback 时),并且在 Page_Load 中调用了 gvCases.DataBind(),在事件处理之前。因此,当你重新绑定 DropDownList 时,也会清除已触发的 SelectedIndexChanged 事件。你明确在 Page_Load 中进行数据绑定的原因是什么,而不是将 GridView 的数据源设置为某个 SQLDataSource 并让它自己完成呢? - Ian Pugsley
哦,我明白你的意思了。我没有理由不使用网格视图SQLDataSource,只是因为我喜欢这样做,并将所有数据逻辑与前端分离。但我在Page_Load中绑定数据时添加了“If Not Page.IsPostBack Then”,现在似乎有所进展,SelectedIndexChanged事件正在触发 :)。希望我现在可以通过一些尝试来完成其余部分的工作。 - Jammer
在解决了postback的问题之后,完成得很快,真不敢相信问题如此微小。现在,我已经让它从下拉列表中选择项目并更新数据库了。非常感谢您的努力和帮助。 - Jammer

4

您说AutoPostBack被设置为true,但我在标记中没有看到它,并且默认情况下它被设置为false。因此,请尝试:

<asp:DropDownList ID="iconUsers" runat="server" OnSelectedIndexChanged="iconUsers_SelectedIndexChanged" AutoPostBack="true">
            </asp:DropDownList>

嗨Bala,这是在gvCases_RowDataBound的代码后面:iconUsers.AutoPostBack = True。我可以看到页面在我更改下拉列表时也会回传,但事件不会触发。 - Jammer

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