Как повторно заполнить зависимые раскрывающиеся списки при изменении главного раскрывающегося списка?

У меня есть три выпадающих списка, где содержимое второго зависит от того, что выбрано в первом, а содержимое третьего зависит от того, что выбрано во втором. Это работает при первом отображении страницы:

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If PageAlreadyInitted = True Then Exit Sub
    If Page.IsPostBack = True Then Exit Sub
    PageAlreadyInitted = True

    Dim sqlDAL As New SQLServer(ConfigurationSettings.AppSettings("ConnectionString"))
    'Populate the Units dropdown
    Dim unitsDT As DataTable
    Dim sql As String = "Select distinct mu.unit from masterunits mu left join MasterUnitsProjSales mps on mps.Unit = mu.Unit where abs(active) = 1 and mps.NewBiz != 0 order by mu.unit"
    Dim retDS As DataSet = sqlDAL.runSQLDataSet(sql)
    unitsDT = retDS.Tables(0)
    DropDownListUnits.DataSource = unitsDT
    DropDownListUnits.DataTextField = "unit"
    DropDownListUnits.DataValueField = "unit"
    DropDownListUnits.DataBind()

    'Populate the Members dropdown - TODO: Call this when Unit changes, too
    Dim selectedUnit As String = DropDownListUnits.SelectedItem.Text
    Dim membersDT As DataTable
    sql = "select distinct shortname, M.memberno from members M left join memberunitproducts mup on M.MemberNo = mup.MemberNo where unit = '" + selectedUnit + "' order by shortname"
    retDS = sqlDAL.runSQLDataSet(sql)
    membersDT = retDS.Tables(0)
    DropDownListMembers.DataSource = membersDT
    DropDownListMembers.DataTextField = "shortname"
    DropDownListMembers.DataValueField = "memberno"
    DropDownListMembers.DataBind()

    'Populate the Customers dropdown - TODO: Call this when Member changes, too
    Dim selectedMember As String = DropDownListMembers.SelectedItem.Value
    Dim customersDT As DataTable
    sql = "select distinct companyname, custno from customers C left join members M on M.MemberNo = C.MemberNo where M.MemberNo = '" + selectedMember + "' order by companyname"
    retDS = sqlDAL.runSQLDataSet(sql)
    customersDT = retDS.Tables(0)
    DropDownListCustomers.DataSource = customersDT
    DropDownListCustomers.DataTextField = "companyname"
    DropDownListCustomers.DataValueField = "custno"
    DropDownListCustomers.DataBind()

    sqlDAL.Dispose()
End Sub

... но мне нужно, чтобы второе раскрывающееся меню обновлялось при изменении выбора первого, а третье - при изменении выбора второго. У меня есть этот код, чтобы попытаться выполнить это:

Protected Sub DropDownListUnits_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DropDownListUnits.SelectedIndexChanged
    DropDownListMembers.Items.Clear()
    DropDownListCustomers.Items.Clear()

    'Dim selectedUnit As String = DropDownListUnits.SelectedItem.Text
    Dim selectedUnit As String = DropDownListUnits.SelectedItem.ToString()
    Label2.Text = selectedUnit

    Dim sqlDAL As New SQLServer(ConfigurationSettings.AppSettings("ConnectionString"))
    Dim membersDT As DataTable
    Dim retDS As DataSet
    Dim sql As String = "select distinct shortname, M.memberno from members M left join memberunitproducts mup on M.MemberNo = mup.MemberNo where unit = '" + selectedUnit + "' order by shortname"
    retDS = sqlDAL.runSQLDataSet(sql)
    membersDT = retDS.Tables(0)

    DropDownListMembers.DataSource = membersDT
    DropDownListMembers.DataTextField = "shortname"
    DropDownListMembers.DataValueField = "memberno"
    DropDownListMembers.DataBind()
End Sub

... но это бесполезно - возможно, потому что событие может не запускаться. Во всяком случае, кажется, что это не так - это очевидно, потому что ни DropDownListMembers, ни DropDownListCustomers не очищаются, а DropDownListMembers не заполняются другим набором элементов.

Итак, мой вопрос заключается в том, как я могу повторно заполнить «зависимые» раскрывающиеся списки при их изменении, но, возможно, вопрос действительно должен звучать так: «Как я могу вызвать событие SelectedIndexChanged()?


person B. Clay Shannon    schedule 13.04.2017    source источник
comment
У DropDownLists для AutoPostBack установлено значение true?   -  person NoAlias    schedule 13.04.2017
comment
Кажется, это шаг в правильном направлении (нет, не был — интересно, почему их нет по умолчанию?). Теперь, по крайней мере, второй и третий выпадающие списки очищены. Это начало - спасибо!   -  person B. Clay Shannon    schedule 14.04.2017


Ответы (1)


События не запускаются, потому что AutoPostBack не задано значение true. Установка его в значение true гарантирует, что всякий раз, когда пользователь изменяет выбранный элемент, он запускает обработчик SelectedIndexChanged.

person NoAlias    schedule 13.04.2017