#html #asp.net #webforms #sqldatasource
#HTML #asp.net #веб-формы #sqldatasource
Вопрос:
Я действительно не уверен, как правильно или правильно задать этот вопрос. Мне нужна помощь здесь. Я не уверен, что на этот вопрос уже был дан другой ответ. Поэтому, пожалуйста, наберитесь терпения.
Как мне сделать так, чтобы 3 выпадающих списка были соединены вместе? Например, сделать dropdownlist2 и 3 включенными = «false», чтобы пользователь не мог их трогать, но dropdownlist1 включенным =»true», что делает его единственным, который им нужно выбрать.
выпадающие списки 1-3 используют данные из одной и той же таблицы в SQL Server, в основном DDL1 содержит данные с именем Unit, DDL2 содержит данные с именем Department, а DDL3 содержит данные с именем Direction . Все три из них используют один и тот же идентификатор. Таким образом, пользователю нужно только выбрать подразделение, а затем другие отделы и направления автоматически выбирают свой выбор на основе идентификатора, выбранного в Unit.
Это идея, которую я хочу сделать, но я не могу найти способ сделать это. Я не хочу объединять все данные только в один слот, я хочу, чтобы информация отображалась отдельно, чтобы пользователь мог видеть, выбрала ли система правильный отдел и направление из выбранного им подразделения.
Это код, который у меня есть. Это просто html. Я понятия не имею, как начать то, что мне нужно…Я не уверен, так ли вы это делаете.
<div class="row">
<div class="col-md-3 col-md-offset-1">
<div class="form-group">
<asp:Label Text="Unit:" runat="server" />
<asp:DropDownList ID="DropDownList1" runat="server" CssClass="form-control input-sm" DataSourceID="SqlDataSource2" DataTextField="descriptionUnit" DataValueField="idTest"></asp:DropDownList>
<asp:SqlDataSource runat="server" ID="SqlDataSource2" ConnectionString='<%$ ConnectionStrings:descriptionTest %>' SelectCommand="SELECT [idTest], [descriptionUnit] FROM [Test]"></asp:SqlDataSource>
</div>
</div>
</div>
<div class="row">
<div class="col-md-3 col-md-offset-1">
<div class="form-group">
<asp:Label Text="Deparment" runat="server" />
<asp:DropDownList ID="DropDownList2" Enabled="false" CssClass="form-control input-sm" runat="server" DataSourceID="SqlDataSource3" DataTextField="descriptionDeparment" DataValueField="idTest"></asp:DropDownList>
<asp:SqlDataSource runat="server" ID="SqlDataSource3" ConnectionString='<%$ ConnectionStrings:descriptionTest %>' SelectCommand="SELECT [idTest], [descriptionDeparment] FROM [Test]"></asp:SqlDataSource>
</div>
</div>
<div class="col-md-3 col-md-offset-1">
<div class="form-group">
<asp:Label Text="Direction" runat="server" />
<asp:DropDownList ID="DropDownList3" Enabled="false" CssClass="form-control input-sm" runat="server" DataSourceID="SqlDataSource4" DataTextField="descriptionDirection" DataValueField="idTest"></asp:DropDownList>
<asp:SqlDataSource runat="server" ID="SqlDataSource4" ConnectionString='<%$ ConnectionStrings:descriptionTest %>' SelectCommand="SELECT [idTest], [descriptionDirection] FROM [Test]"></asp:SqlDataSource>
</div>
</div>
</div>
Любая помощь будет оценена
Комментарии:
1. «выпадающие списки 1-3 используют данные из одной и той же таблицы …» «Все три из них используют один и тот же идентификатор». То, что вы говорите, означает, что все необходимые вам данные находятся в одной строке, поэтому вам не нужны каскадные выпадающие списки. Просто хочу убедиться, что вы об этом знаете.
2. Для каскадных выпадающих списков вам нужно
WHERE
предложение в ваших 2-м и 3-м выпадающихSELECT
списках,... WHERE [idTest] = ?
. Как только вы добавите предложение WHERE, выпадающие списки автоматически предоставят вам возможность выбрать, откуда берется значение, и вы можете выбрать первый выпадающий список.3. О, спасибо, wazz! Вместо этого я перестал использовать текстовые поля, чтобы в 2 текстовых полях отображались данные отдела и направления, поэтому unit является единственным выбранным, и поскольку unit содержит идентификатор, который будет записан в таблице благодаря внешнему ключу, я так и сделал. Я думал, что это проще и работает в конце. Но спасибо, Wazz!
Ответ №1:
Хорошо, я предлагаю вам удалить 3 источника данных. Просто удалите их, а для 3 полей со списком удалите параметр источника данных (этот).
DataSSourceID (перейдите во все 3 выпадающих списка и ОЧИСТИТЕ этот параметр).
Хорошо, теперь в событии загрузки форм мы заполняем ТОЛЬКО первое поле.
например, это:
If IsPostBack = false then
' first time page load - fill the 1st combo box
DropDownList2.DataSource = MyRst("SELECT idTest, descriptionDeparment FROM Test")
End If
Установите для выпадающих списков 2 и 3 значение auto post back = true.
На этом этапе 1-й выпадающий список будет заполнен.
Пользователь выбирает значение. В выбранном событии изменения индекса (1-я комбинация) у вас есть этот код:
Dim strSQL As String
strSQL = " SELECT idTest, descriptionDeparment FROM Test " amp; _
" WHERE DDL2 = '" amp; DropDownList.DataTextField amp; "'"
DropDownList3.DataSource = MyRst(strSQL)
DropDownList3.DataBind()
И сделайте то же самое для события изменения индекса DropDownList2.
У меня нет правильных имен полей, но я просто устанавливаю sql для 2-го выпадающего списка на основе любого значения, на которое был установлен первый выпадающий список.
А чтобы сэкономить ввод текста, у меня есть удобная процедура под названием MyRst, и я использую ее для заполнения сеток, списков или, в данном случае, выпадающего списка.
Все, что делает эта процедура, это возвращает объект таблицы на основе заданного sql, и эта процедура выглядит следующим образом:
Public Function Myrst(strSQL As String) As DataTable
Dim rstData As New DataTable
Using cmdSQL As New SqlCommand(strSQL,
New SqlConnection(My.Settings.Test4))
Try
cmdSQL.Connection.Open()
rstData.Load(cmdSQL.ExecuteReader)
Catch ex As Exception
rstData = Nothing
End Try
End Using
Return rstData
End Function
В приведенном выше, конечно, замените мое использование настроек на заданную вами строку подключения. Эта процедура также означает, что у вас когда-либо будет ОДНО местоположение строки подключения во всем вашем приложении.
И это также не загромождает веб-форму — нет необходимости добавлять элемент управления источником данных для sql для подачи выпадающего списка (и, следовательно, ОЧЕНЬ легко сделать / сделать sql динамическим на основе предыдущих выпадающих списков.
Итак, просто повторите этот 2-й бит кода для 2-го выпадающего списка, чтобы отфильтровать / ограничить 3-е поле со списком.
Не забудьте для выпадающих списков 1 и 2 установить значение auto postback = true . 3-й выпадающий список, конечно, не содержит никакого кода.
Также не зная использованных имен столбцов?
DropDownList.SelectedValue - this gets you first PK row
DropDownList.DataTextField - this gets you the 2nd column
DropDownList.Text - this ALSO gets you the 2nd column
Итак, предполагается, что вы настраиваете выпадающий список с помощью:
DataValueField = "ID"
DataTextField = 2nd description column
Итак, проверьте поле значения данных и текстовое поле данных в выпадающем списке. Вы ОЧЕНЬ хотели использовать мастер для их заполнения — и они установили вышеуказанные настройки 2 столбцов.
Итак, автоматическая обратная передача = true для первых двух, и, конечно, выберите / измените приведенный выше sql для ограничения на основе любого столбца, который вы хотите. Если рассматриваемый столбец НА самом деле ОТСУТСТВУЕТ в первом поле со списком, выберите строку на основе идентификатора PK и возьмите другой столбец таким образом, чтобы отфильтровать 2-й выпадающий список. Учитывая, что у нас есть эта удобная процедура MyRst() , то довольно короткая работа, чтобы иметь дополнительный запрос в первом событии изменения индекса в поле со списком, который получает / захватывает фактический столбец, который вам нужен / хотите отфильтровать.
Комментарии:
1. О, спасибо, Альберт! Вместо этого я перестал использовать текстовые поля, чтобы в 2 текстовых полях отображались данные отдела и направления, поэтому unit является единственным выбранным, и поскольку unit содержит идентификатор, который будет записан в таблице благодаря внешнему ключу, я так и сделал. Я думал, что это проще и работает в конце. Но спасибо, Альберт!