Несколько выпадающих списков, привязанных к одному выпадающему списку

#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 содержит идентификатор, который будет записан в таблице благодаря внешнему ключу, я так и сделал. Я думал, что это проще и работает в конце. Но спасибо, Альберт!