Member 13914727 Ответов: 1

Как передать выбранное значение из выпадающего списка в таблицу SQL


Привет,
У меня есть два выпадающих списка: один-привязанный к базе данных(сайт) , а другой-несвязанный(склад),
второй выпадающий список изменит значение на основе 1-го выпадающего списка
Мне нужно вставить выпадающие значения в мою таблицу, когда я выбираю сайт, он вставляется в таблицу, но когда я выбираю склад, он не вставляется в мою таблицу.
Как привязать значение раскрывающегося списка склада?

Что я уже пробовал:

Это мой дизайнерский код:
<asp:TemplateField HeaderText="Site" SortExpression="SITE">
  <EditItemTemplate>
<asp:textbox ID="TxtsiteEdit" runat="server" Text='<%# Bind("SITE") %>'></asp:textbox>
</EditItemTemplate>
                                                                   <InsertItemTemplate>
    <asp:DropDownList ID="TxtsiteInsert" runat="server" Text='<%# Bind("SITE") %>'
                                                                           TabIndex="6" AutoPostBack="True" DataSourceID="inventsite"
                                                                           DataTextField="SITEID" DataValueField="SITEID"  OnSelectedIndexChanged="sitedropdown_SelectedIndexChanged">
                                                                                                                            </asp:DropDownList>
          </InsertItemTemplate>
    <ItemTemplate>
                                                                       <asp:Label ID="TxtSite" runat="server" Text='<%# Bind("SITE") %>'></asp:Label>
          </ItemTemplate>
          </asp:TemplateField>
            <asp:TemplateField HeaderText="Warehouse" SortExpression="WAREHOUSE">
                                                                   <EditItemTemplate>
                                                                       <asp:TextBox ID="TxtWarehouseEdit" runat="server" Text='<%# Bind("WAREHOUSE") %>'></asp:TextBox>

                                                                   </EditItemTemplate>
                                                                   <InsertItemTemplate>

                                                      <asp:DropDownList ID= "TxtWarehouseInsert" runat="server" AutoPostBack="True"  >

                                                                       </asp:DropDownList>
                                                                   </InsertItemTemplate>
                  <ItemTemplate>
       <asp:Label ID="TxtWarehouse" runat="server" Text='<%# Bind("WAREHOUSE") %>'></asp:Label>
          </ItemTemplate>
     </asp:TemplateField>

Это мой vb код:
Protected Sub sitedropdown_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)

       Dim IdTxtsiteInsert As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtsiteInsert"), DropDownList)
       Response.Cookies("sitedropdownvalue").Value = IdTxtsiteInsert.SelectedValue


       Fillwarehouse(IdTxtsiteInsert.Text)
       'Dim IdTxtWarehouseInsert As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtWarehouseInsert"), DropDownList)
       'insertwarehouse(IdTxtsiteInsert.Text, IdTxtWarehouseInsert.Text)


   End Sub
   Public Sub Fillwarehouse(ByVal siteid As String)
       'Dim IdTxtWarehouseInsert As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtWarehouseInsert"), DropDownList)
       Dim ddr As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtWarehouseInsert"), DropDownList)
       Dim strConn As String = WebConfigurationManager.ConnectionStrings("BMGINC_DYNAX09_ProdConnectionString").ConnectionString
       Dim con As New SqlConnection(strConn)
       Dim cmd As New SqlCommand()
       cmd.Connection = con
       cmd.CommandType = CommandType.Text
       cmd.CommandText = "Select InventLocationId, Name from InventLocation where InventSiteId ='" & siteid & "'"
       cmd.Parameters.AddWithValue("InventSiteId", siteid)
       Dim objDs As New DataSet()
       Dim dAdapter As New SqlDataAdapter()
       dAdapter.SelectCommand = cmd
       con.Open()
       dAdapter.Fill(objDs)
       con.Close()
       If objDs.Tables(0).Rows.Count > 0 Then
           ddr.DataSource = objDs.Tables(0)
           ddr.DataTextField = "InventLocationId"
           ddr.DataValueField = "InventLocationId"
           ddr.DataBind()
           ddr.Items.Insert(0, "-Select-")


       Else

           LblError.Text = "No Warehouse found"

       End If
   End Sub

Richard Deeming

cmd.CommandText = "Select InventLocationId, Name from InventLocation where InventSiteId ='" & siteid & "'"


Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Вы уже добавляете параметр; все, что вам нужно сделать, это использовать его:
cmd.CommandText = "Select InventLocationId, Name from InventLocation where InventSiteId = @InventSiteId"

Member 13914727

Общественные суб Fillwarehouse(как byval ID сайта в строку)
'Dim IdTxtWarehouseInsert As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtWarehouseInsert"), DropDownList)
Dim ddr1 As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtWarehouseInsert"), DropDownList)
Dim strConn As String = WebConfigurationManager.Выберите("BMGINC_DYNAX09_ProdConnectionString").Параметр connectionString
Dim con как новый SqlConnection(strConn)
Dim cmd как новая команда SqlCommand()
УМК.Подключение = кон
УМК.Свойство Commandtype = Значение Commandtype.Текст
УМК.CommandText = "Select InventLocationId, Name from InventLocation where InventSiteId =@InventSiteId"
-командир.Параметры.AddWithValue("InventSiteId", siteid)
Dim objDs как новый набор данных()
Dim dAdapter как новый SqlDataAdapter()
дадаптер.Команды selectcommand = ЦМД
против.Открыть()
дадаптер.Заполнение(objDs)
против.Закрывать()
Если возражает.Таблицы(0).Строки.Тогда считайте > 0
ddr1.Источник данных = objDs.Таблицы(0)
ddr1.DataTextField = "InventLocationId"
ddr1.DataValueField = "InventLocationId"
ddr1.Привязку()
ddr1.Предметы.Insert(0, "-выбрать склад-")

Еще

LblError.Text = "склад не найден"

Конец, Если
-РДР.Текст = ddr1.SelectedValue

Конец Подводной Лодки


Он показывает ошибку, так как должен объявить скалярную переменную

Member 13914727

Общественные суб Fillwarehouse(как byval ID сайта в строку)
'Dim IdTxtWarehouseInsert As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtWarehouseInsert"), DropDownList)
Dim ddr1 As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtWarehouseInsert"), DropDownList)
Dim strConn As String = WebConfigurationManager.Выберите("BMGINC_DYNAX09_ProdConnectionString").Параметр connectionString
Dim con как новый SqlConnection(strConn)
Dim cmd как новая команда SqlCommand()
УМК.Подключение = кон
УМК.Свойство Commandtype = Значение Commandtype.Текст
cmd.CommandText = "Select InventLocationId, Name from InventLocation where InventSiteId =@InventSiteId"
cmd.параметры.AddWithValue("@InventSiteId", InventSiteId)
Dim objDs как новый набор данных()
Dim dAdapter как новый SqlDataAdapter()
дадаптер.Команды selectcommand = ЦМД
кон.Открыть()
дадаптер.Заполнение(objDs)
кон.Рядом()
Если возражает.Таблицы(0).Строки.Тогда считайте > 0
ddr1.Источник данных = objDs.Таблицы(0)
ddr1.DataTextField = "InventLocationId"
ddr1.DataValueField = "InventLocationId"
ddr1.Привязку()
ddr1.Предметы.Insert(0, "-выбрать склад-")


Да сделано вот так

1 Ответов

Рейтинг:
2

Ziee-M

Привет,

Вы не задали событие (выбранное изменение индекса) для второго выпадающего списка.

Вы просто должны добавить его и имплицировать свою логику.

Надеюсь, это поможет.


Member 13914727

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

Ziee-M

Вы также должны проверить комментарий, опубликованный Ричардом, ваш код уязвим для Sql-инъекции, есть много различных способов достичь этого, используя ORM, такой как EntityFramework, или поиск SqlParameter, чтобы вставить ваши parmaeters в sql-запрос вместо жесткого кодирования их

Member 13914727

Да изменил его

Ziee-M

Сначала добавьте и сгенерируйте свое событие для второго выпадающего списка :
&ЛТ;как ASP:dropdownlist с ИД= "TxtWarehouseInsert" атрибут runat="сервер" autopostback элемента управления="истинный" OnSelectedIndexChanged="TxtWarehouseInsert_SelectedIndexchanged"&ГТ;
Затем в новом событии сохраните свои данные в базе данных. Вы можете получить выпадающий текст/значение с помощью TxtWarehouseInsert.SelectedValue/TxtWarehouseInsert.SelectedText

Member 13914727

Это мое событие вставки
Защищенные суб BtnInsert_Click(как byval отправителя как объект, как byval E Как EventArgs в)

Dim Idtxtsiteinsert As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtsiteInsert"), DropDownList)
Dim Idtxtwarehouseinsert As DropDownList = CType(DetailsView3.Rows(0).FindControl("TxtWarehouseInsert"), DropDownList)
warehousedropdown = Idtxtwarehouseinsert.SelectedValue
Конец Подводной Лодки

Member 13914727

Но я получаю сообщение об ошибке поле не может быть пустым, что мне теперь делать

Ziee-M

Нам нужно больше вашего кода(html/codebehind).
Быстрое предположение с недостаточной информацией, ваша первая строка кода возвращает null, так как строки(0) являются строкой заголовка. вы должны получить данные из второго ряда.
Вы должны использовать инструменты отладки, чтобы найти проблему.

Member 13914727

Я получаю ошибку в этом событии:

 Private Sub DetailsView3_ItemInserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertedEventArgs) Handles DetailsView3.ItemInserted
        LblError.Text = ""

        Dim jno As Integer, lno As Integer
        Dim IdLblJnoInsert As Label = CType(DetailsView3.Rows(0).FindControl("LblJnoInsert"), Label)
        Dim IdLblLnoInsert As Label = CType(DetailsView3.Rows(0).FindControl("LblLnoInsert"), Label)

        If (e.Exception IsNot Nothing) Then
            e.ExceptionHandled = True
            e.KeepInInsertMode = True
            LblError.Text = "Please Check your values. Line not inserted" & e.Exception.ToString
        Else
            Try
 jno = Integer.Parse(IdLblJnoInsert.Text)
                lno = Integer.Parse(IdLblLnoInsert.Text)
                
                updatebom(jno, lno, 1)
                UpdateJournalHdr(jno)
                GridView4.DataBind()
                GridView3.DataBind()
            Catch ex As Exception
                LblError.Text = "BOM Lines Insert:" & Err.Description
            End Try
        End If

Member 13914727

Please Check your values. Line not insertedSystem.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'WAREHOUSE', table 'BMGINC_DYNAX09_Prod.dbo.PRODJOURNALBOMTEMP'; column does not allow nulls. INSERT fails. The statement has been terminated. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand command, DataSourceOperation operation) at System.Web.UI.WebControls.SqlDataSourceView.ExecuteInsert(IDictionary values) at System.Web.UI.DataSourceView.Insert(IDictionary values, DataSourceViewOperationCallback callback)