【问题标题】:How can I access the value of the selected item in a dropdown?如何访问下拉列表中所选项目的值?
【发布时间】:2017-09-08 21:32:00
【问题描述】:

我有这段代码,它可以根据第一个下拉列表中的内容(在页面的 Page_Init 事件中)填充第二个下拉列表:

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    . . .
    'Populate the Units dropdown
    Dim unitsDT As DataTable
    sql = "Select distinct unit from masterunits where abs(active) = 1"
    retDS = sqlDAL.runSQLDataSet(sql)
    unitsDT = retDS.Tables(0)
    DropDownListUnits.DataSource = unitsDT
    DropDownListUnits.DataTextField = "unit"
    DropDownListUnits.DataValueField = "unit"
    DropDownListUnits.DataBind()

    'Populate the Members dropdown based on Unit selected
    'Dim selectedUnit As String = DropDownListUnits.Text
    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()
    . . .
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 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

...但它不起作用 - 从 DropDownListUnits 中选择不同的单位不会改变 DropDownListMembers 中的内容。

显然是这样的:

Dim selectedUnit As String = DropDownListUnits.SelectedItem.Text

...未检索从 DropDownListUnits 中选择的新值到 selectedUnit。

我什至添加了这个,用于调试目的:

Label2.Text = selectedUnit

...但 Label2 永远不会改变。

我在这里做错了什么?

更新

基于this,我也试过这个:

Dim selectedUnit As String = DropDownListUnits.SelectedItem.ToString()

...但没有区别。

更新 2

该事件显然甚至没有触发。这段代码:

Protected Sub DropDownListUnits_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DropDownListUnits.SelectedIndexChanged
        Label2.Text = "it fired"
        . . .

...显示 Label2 的文本没有变化...

更新 3

当我尝试将此作为 Page_Init 事件的第一行时:

If Not IsPostBack Then Exit Sub

...它甚至没有运行一次。

我已经有类似的东西了:

Dim PageAlreadyInitted As Boolean = False

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

更新 4

根据上一条评论,我在 Page_Init 中尝试了这个:

If Page.IsPostBack = True Then Exit Sub

...这没什么区别 - 我仍然没有从 DropDownListUnits_SelectedIndexChanged 事件中得到任何结果;它显然没有被解雇,因为 Label2 没有更改为“它被解雇”,因为它应该:

Protected Sub DropDownListUnits_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DropDownListUnits.SelectedIndexChanged
    Label2.Text = "it fired"

更新 5

这比 Keith Richards 头上从椰子树上掉下来后的头发更乱:我尝试访问下拉列表中显示的值,但它给了我错误的值。

这是填充下拉列表的代码:

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 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 = "companyname"
    DropDownListCustomers.DataBind()

    sqlDAL.Dispose()
End Sub

这是我看到的:

请注意,“Applebees”是显示的单位(我没有选择它 - 它是集合中的第一项,默认显示)。

然而,当我混合按钮时,存储在数据库中的 Unit 值是“Abuelos”而不是“Applebees”。这不仅令人沮丧,而且非常奇怪,因为“Abuelos”甚至不存在于物品集合中:

这是试图获取值的代码,用于在数据库中更新和插入记录:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim connStr As String = "SERVER=PROSQL05;DATABASE=cpsdata;UID=sa;PWD=sqlsql"
    Dim upd8DML As String = "UPDATE CustomerCategoryLog SET Category = 'Existing', EndDate = @DateTimeYesterday, ChangedOn = @CurrentDateTime WHERE Unit = @Unit And MemberNo = @MemberNo AND Custno = @CustNo"
    Dim insertDML As String = "INSERT INTO CustomerCategoryLog (MemberNo, Unit, Custno, Category, Subcategory, BeginDate, ChangedBy, ChangedOn) VALUES (@MemberNo_Insert, @Unit_Insert, @CustNo_Insert, @Category, @Subcategory, @BeginDate, @ChangedBy, @ChangedOn)"

    Dim coName As String
    Dim argVals(2) As String
    Dim _Unit As String
    Dim _MemberNo As String
    Dim _CustNo As String

    coName = DropDownListCustomers.SelectedItem.ToString()
    argVals = GetArgValsForCompanyName(coName)
    _Unit = argVals(0)
    _MemberNo = argVals(1)
    _CustNo = argVals(2)
    Using conn As New SqlConnection(connStr), _
            cmd As New SqlCommand(upd8DML, conn)
        cmd.Parameters.Add("@Unit", SqlDbType.VarChar, 50).Value = _Unit
        cmd.Parameters.Add("@MemberNo", SqlDbType.VarChar, 50).Value = _MemberNo
        cmd.Parameters.Add("@CustNo", SqlDbType.VarChar, 50).Value = _CustNo
        cmd.Parameters.Add("@DateTimeYesterday", SqlDbType.DateTime).Value = DateTime.Today.AddDays(-1)
        cmd.Parameters.Add("@CurrentDateTime", SqlDbType.DateTime).Value = Date.Now
        conn.Open()
        cmd.ExecuteScalar()
    End Using
    ' Now insert a new record with "Existing" categories and Now as the BeginDate
    Using conn As New SqlConnection(connStr), _
            cmd As New SqlCommand(insertDML, conn)
        cmd.Parameters.Add("@MemberNo_Insert", SqlDbType.VarChar, 50).Value = _MemberNo
        cmd.Parameters.Add("@Unit_Insert", SqlDbType.VarChar, 50).Value = _Unit
        cmd.Parameters.Add("@CustNo_Insert", SqlDbType.VarChar, 50).Value = _CustNo
        cmd.Parameters.Add("@Category", SqlDbType.VarChar, 50).Value = "Existing"
        cmd.Parameters.Add("@Subcategory", SqlDbType.VarChar, 50).Value = "Existing"
        cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value = DateTime.Today
        cmd.Parameters.Add("@ChangedBy", SqlDbType.VarChar, 50).Value = Environment.UserName
        cmd.Parameters.Add("@ChangedOn", SqlDbType.DateTime).Value = Date.Now
        conn.Open()
        cmd.ExecuteScalar()
    End Using
End Sub

这是在数据库中插入和更新的内容:

如您所见,“Abuelos”是单位值,虽然它应该是“Applebees” - Hec Ramsey 是什么!?!

【问题讨论】:

    标签: asp.net vb.net html-select selecteditem selectedindexchanged


    【解决方案1】:

    您需要仅在初始页面加载时使用 If Not IsPostBack 填充 DropDownListUnits。否则,DropDownListUnits 会在回发时填充新数据,并丢失所选值。

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       If Not IsPostBack
        . . .
        'Populate the Units dropdown
        Dim unitsDT As DataTable
        sql = "Select distinct unit from masterunits where abs(active) = 1"
        retDS = sqlDAL.runSQLDataSet(sql)
        unitsDT = retDS.Tables(0)
        DropDownListUnits.DataSource = unitsDT
        DropDownListUnits.DataTextField = "unit"
        DropDownListUnits.DataValueField = "unit"
        DropDownListUnits.DataBind()
            . . .
    
       End If
    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.SelectedValue
                                                             ^^^^^^
    
        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
    

    【讨论】:

    • 当然可以根据另一个下拉列表中的内容动态填充下拉列表,没有 es verdad/nicht wahr?
    • 您无需在Page_Init 中填写DropDownListMembers。相反,您可以使用DropDownListUnits.SelectedValueDropDownListUnits_SelectedIndexChanged 事件中填充数据。
    • 好吧,我想我误解了,“您只想在初始页面加载时将数据填充到 DropDownList”
    • 在 Page_Init 中注释掉成员和客户的填充并没有帮助 - 选择单位时我仍然一无所获。似乎 Unit 下拉列表的 IndexChanged 事件似乎没有被触发。
    • 您是否在 Page_Init 事件中使用了 If Not IsPostBack
    【解决方案2】:

    显然,这确实有效:

    _Unit = DropDownListUnits.SelectedItem.ToString() 
    _MemberNo = DropDownListMembers.SelectedValue.ToString()
    _CustNo = DropDownListCustomers.SelectedValue.ToString()
    

    正在使用这些值更新/插入记录。在更多上下文中:

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim connStr As String = "SERVER=PROSQL05;DATABASE=cpsdata;UID=sa;PWD=sqlsql"
        Dim upd8DML As String = "UPDATE CustomerCategoryLog SET Category = 'Existing', EndDate = @DateTimeYesterday, 
    

    ChangedOn = @CurrentDateTime WHERE Unit = @Unit And MemberNo = @MemberNo AND Custno = @CustNo" Dim insertDML As String = "INSERT INTO CustomerCategoryLog (MemberNo, Unit, Custno, Category, Subcategory, BeginDate、ChangedBy、ChangedOn)值(@MemberNo_Insert、@Unit_Insert、@CustNo_Insert、@Category、@Subcategory、 @BeginDate、@ChangedBy、@ChangedOn)"

        Dim _Unit As String
        Dim _MemberNo As String
        Dim _CustNo As String
    
        _Unit = DropDownListUnits.SelectedItem.ToString() 
        _MemberNo = DropDownListMembers.SelectedValue.ToString()
        _CustNo = DropDownListCustomers.SelectedValue.ToString()
        Using conn As New SqlConnection(connStr), _
                cmd As New SqlCommand(upd8DML, conn)
            cmd.Parameters.Add("@Unit", SqlDbType.VarChar, 50).Value = _Unit
            cmd.Parameters.Add("@MemberNo", SqlDbType.VarChar, 50).Value = _MemberNo
            cmd.Parameters.Add("@CustNo", SqlDbType.VarChar, 50).Value = _CustNo
            cmd.Parameters.Add("@DateTimeYesterday", SqlDbType.DateTime).Value = DateTime.Today.AddDays(-1)
            cmd.Parameters.Add("@CurrentDateTime", SqlDbType.DateTime).Value = Date.Now
            conn.Open()
            cmd.ExecuteScalar()
        End Using
        ' Now insert a new record with "Existing" categories and Now as the BeginDate
        Using conn As New SqlConnection(connStr), _
                cmd As New SqlCommand(insertDML, conn)
            cmd.Parameters.Add("@MemberNo_Insert", SqlDbType.VarChar, 50).Value = _MemberNo
            cmd.Parameters.Add("@Unit_Insert", SqlDbType.VarChar, 50).Value = _Unit
            cmd.Parameters.Add("@CustNo_Insert", SqlDbType.VarChar, 50).Value = _CustNo
            cmd.Parameters.Add("@Category", SqlDbType.VarChar, 50).Value = "Existing"
            cmd.Parameters.Add("@Subcategory", SqlDbType.VarChar, 50).Value = "Existing"
            cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value = DateTime.Today
            cmd.Parameters.Add("@ChangedBy", SqlDbType.VarChar, 50).Value = Environment.UserName
            cmd.Parameters.Add("@ChangedOn", SqlDbType.DateTime).Value = Date.Now
            conn.Open()
            cmd.ExecuteScalar()
        End Using
    End Sub
    

    所以,得到显示的值是这样的:

    _Unit = DropDownListUnits.SelectedItem.ToString() 
    

    ...以及像这样的数据值:

    _MemberNo = DropDownListMembers.SelectedValue.ToString()
    _CustNo = DropDownListCustomers.SelectedValue.ToString()
    

    ...确实有效。

    我仍然(不同的问题)无法根据第一个下拉列表的值在第二个和第三个下拉列表更改时重新填充它...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-23
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多