【问题标题】:Changing DropDown Selected Item Based on Selected Value (ASP.NET)根据所选值更改下拉所选项目 (ASP.NET)
【发布时间】:2012-10-14 16:30:09
【问题描述】:

我的页面 (ddlProgram) 上有一个下拉列表,该下拉列表通过数据库查询填充,如下所示:

Using dbContext as IRFEntities = New IRFEntities
    Dim getPrograms = (From p in dbContext.IRF_Program _
                       Order By p.name _
                       Select p)
    ddlProgram.DataSource = getPrograms
    ddlProgram.DataTextField = "name"
    ddlProgram.DataValueField = "id"
    ddl.Program.DataBind()
End Using

因此,例如,可能有一个“教育”的 DataTextField 和一个“221”的 ID。

现在,我在表单中预先填充有关访问该网站的个人的信息(如果有) - 包括如下所示的下拉列表:

If getProspect IsNot Nothing Then
  If getProspect.user_id Is Nothing Then
    ddlProgram.SelectedValue = getProspect.Program
  End If
End If

Program 属性包含一个与 Program 的 ID 匹配的数字。因此,例如,此人可能有一个“221”计划,它与上面提到的“221”教育相匹配。

当前应用程序成功地将 DropDownList (ddlProgram) 的 SelectedValue 设置为“221”,但 DDL 的 SelectedItem 保持不变(例如,如果在预填充后最初是 ID 为“1”的“History”它是 ID 为“221”的“历史”)。

我想要实现的是将 SelectedItem 更新为与 SelectedValue 对应的项目。因此,最后,如果个人在预填充表单时选择了“教育”的“221”,他们会将教育视为所选项目,并且所选值将被正确设置,而现在表单显示错误的 SelectedItem但在幕后拥有正确的 SelectedValue。

下面是来自 Page_Load 事件的代码流的更完整概念:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Page.IsPostBack = False Then
        ' If prospect is coming from unique url
        Dim prospect_url As String = Page.RouteData.Values("value")
        ' Save prospect_url into session variable
        Session("prospect_url") = prospect_url
        Using dbContext As IRFEntities = New IRFEntities
            ' Prepopulate the programs dropdown.
            Dim getPrograms = (From p In dbContext.IRF_Program _
                            Order By p.name _
                             Select p)
            ddlProgram.DataSource = getPrograms
            ddlProgram.DataTextField = "name"
            ddlProgram.DataValueField = "id"
            ddlProgram.DataBind()
        End Using
        Using dbContext As IRFEntities = New IRFEntities
            ' Prepopulate the states dropdown.
            Dim getStates = (From p In dbContext.IRF_States _
                             Order By p.name _
                            Select p)
            ddlState.DataSource = getStates
            ddlState.DataTextField = "name"
            ddlState.DataValueField = "id"
            ddlState.DataBind()
        End Using
        Using dbContext As IRFEntities = New IRFEntities
            ' Grab info. about prospect based on unique url.
            Dim getProspect = (From p In dbContext.IRF_Prospects _
                              Where p.url = prospect_url _
                              Select p).FirstOrDefault
            ' If they have a record...
            If getProspect IsNot Nothing Then
                If getProspect.user_id Is Nothing Then
                    ' Prepopulate the form with their information.
                    ' These must have a value, so we need to make sure that no column is null in the database.
                    ddlProgram.SelectedValue = getProspect.program
                    txtFirst.Text = getProspect.first_name
                    txtLast.Text = getProspect.last_name
                    txtAddress.Text = getProspect.address
                    txtCity.Text = getProspect.city
                    ddlState.SelectedValue = getProspect.state
                    txtZip.Text = getProspect.zip
                    txtPhone.Text = getProspect.phone
                    txtEmail.Text = getProspect.email_address
                    txtYearEnrolling.Text = getProspect.enrolling_in
                Else
                    ' Redirect them to login.
                    Response.Redirect("login.aspx")
                End If
            End If
        End Using
    End If
End Sub

【问题讨论】:

  • 每次回发都重新绑定吗?
  • 仅当页面不是回发时才会绑定到程序列表的下拉列表,即拉入单个信息。 (包括他们选择的程序)在每次回发时发生。但是,页面通常是静态的,实际上不应该有多次回发(除非有人出于某种原因决定刷新页面)。
  • 添加更多代码以显示您的页面流程
  • 怎么知道选中的值和item有区别?
  • 我知道 b/c 然后我会将值提交到数据库,虽然所选项目在表单页面上显示不正确,但它会将正确的值从 selectedvalue 发布到数据库。它现在似乎可以工作了。

标签: asp.net vb.net


【解决方案1】:

您正在做的事情看起来应该可行。如果在设置值后下断点并检查 SelectedItem 文本和值,它们是按预期显示还是不匹配?

使用即时窗口检查:

ddlProgram.SelectedItem.Text
ddlProgram.SelectedItem.Value

如果它们看起来相同,那么我会假设正在重新触发绑定代码并且正在重新生成列表并选择第一个项目。

要检查这一点,请在绑定代码上设置一个断点并查看它是否被多次触发并适当地更正方法的顺序。

添加: 如果它适用于您的本地环境,它应该在发布时工作,如果代码相同?查看您的代码,我首先将一些数据绑定代码分离到单独的方法中,而不是将所有内容都放在 Page_Load 中,一个是因为它是一种很好的做法,二是因为它会使调试更容易。除此之外,我不确定还有什么建议。

【讨论】:

  • 嗯,这很奇怪......它刚刚开始工作!不过你的建议很有帮助,谢谢。
  • 好的,让我收回。它在本地主机上正常工作,但是当发布到生产服务器时它不能正常工作 - 它有原始问题中提到的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多