1

私のページ(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

したがって、たとえば、「Education」のDataTextFieldと「221」のIDを持つ場合があります。

ここで、サイトにアクセスした個人に関する情報(利用可能な場合)をフォームに事前入力します。これには、次のようなドロップダウンリストが含まれます。

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

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
4

1 に答える 1

2

あなたがしていることはうまくいくはずです。値の設定後にブレークポイントを設定し、SelectedItemのテキストと値を確認した場合、それらは期待どおりに表示されますか、それとも不一致ですか?

イミディエイトウィンドウを使用して、以下を確認します。

ddlProgram.SelectedItem.Text
ddlProgram.SelectedItem.Value

それらが同じように見える場合は、バインディングコードが再起動され、最初のアイテムが選択された状態でリストが再生成されていると考えられます。

これを確認するには、バインディングコードにブレークポイントを設定し、それが複数回発生するかどうかを確認して、メソッドの順序を適切に修正します。

追加:ローカル環境で機能する場合、コードが同じであれば、公開時に機能するはずですか?コードを見ると、Page_Loadにすべてを含めるのではなく、データバインディングコードの一部を個別のメソッドに分離することから始めます。1つは良い習慣であり、2つはデバッグが容易になるためです。それ以上に、他に何を提案すべきかわかりません。

于 2012-10-24T15:48:00.473 に答える