#asp.net #vb.net #data-binding #drop-down-menu
#asp.net #vb.net #привязка к данным #выпадающее меню
Вопрос:
У меня есть 2 выпадающих списка, один — штат, а второй — город. Я пытаюсь создать его таким образом, чтобы, когда пользователь нажимал на состояние, второй выпадающий список заполнялся названиями городов из таблицы данных.
Вот код
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<%--<cc2:CascadingDropDown ID="CascadingDropDown1" runat="server"> </cc2:CascadingDropDown>--%>
<h1>Live Event Search Engine</h1><br />
State: <asp:DropDownList ID="ddlState" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource1" DataTextField="ST_Code" DataValueField="ST_Code" /><asp:SqlDataSource
ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:dbConnection %>"
SelectCommand="SELECT [ST_Code] FROM [State]">
</asp:SqlDataSource>
City: <asp:DropDownList ID="ddlCity" runat="server" DataSourceID="SqlDataSource2" DataTextField="RS_City" DataValueField="RS_City" /><asp:SqlDataSource
ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:dbConnection %>"
SelectCommand="web_PublicProgramListbyState" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:SessionParameter Name="State" SessionField="ST_Code" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
<asp:Button ID="Submit" runat="server" Text="Submit" />
</asp:Content>
и код, лежащий в основе, является
Public Sub ddlState_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ddlState.SelectedIndexChanged
Me.ddlCity.Items.Clear()
Dim da As New SqlDataAdapter("web_PublicProgramListbyState", New SqlConnection(ConfigurationManager.AppSettings("dbConnection")))
Dim ds As New DataSet
da.Fill(ds, "@State")
da.Dispose()
Me.ddlCity.DataSource = ds.Tables("Products")
Me.ddlCity.DataTextField = "ProductName"
Me.ddlCity.DataValueField = "ProductID"
Me.ddlCity.DataBind()
End Sub
End Class
Комментарии:
1. Итак, о какой проблеме вы спрашиваете? Произошла ошибка, это не работает?
2. @Брайан, ну, это не работает. Переменная из «State» не передается в «City», и выпадающий список City не загружается. Я просто получаю сообщение об ошибке.
3. Код показывает привязку программ, а не городов? В любом случае, опубликовано ниже.
Ответ №1:
Похоже, вы пытаетесь включить в это dataset, когда у вас уже есть определенный SqlDataSource. Просто измените параметры SqlDataSource и повторно свяжите:
Public Sub ddlState_SelectedIndexChanged(...)
SqlDataSource2.SelectParameters.Clear()
SqlDataSource2.SelectParameters.Add(New Parameter("@State", DbType.String, ddlState.SelectedValue))
ddlCity.DataBind()
End Sub
Редактировать: Или вы можете использовать ControlParameter, ссылающийся на ddlState.Выбрано значение в SqlDataSource2.Выберите параметры, как указано в другом ответе. Единственная хитрость заключается в том, что вы должны тщательно управлять своими значениями по умолчанию, чтобы ddlCity привязывался только тогда, когда вы этого хотите.
Ответ №2:
Я бы изменил его на управляющий параметр и просто вызвал databind. Нет необходимости заполнять самостоятельно.
<asp:ControlParameter Name="State" ControlID="ddlState" Type="String" />
и затем в событии выбора просто вызовите:
Me.ddlCity.DataBind()
Или, если вы хотите удалить codebehind целиком, поместите его на панель обновления с помощью триггера.
Ответ №3:
Я не вижу, куда событие ddlState_SelectedIndexChanged записывает переменную сеанса. Это обязательно.