0

データベースからの情報に基づいて質問と回答のページを作成する、わずかに動的なページを開発しました。オブジェクトの送信者と選択したListItem情報を検証するためのマイナーなMsgBox応答でRadioButtonListイベントをトリガーできないことを除いて、すべてがうまく機能します。

Page_Load

    If Not Page.IsPostBack Then
        With Globals.tst

            .GetBrandInformation(Page.RouteData.Values("brand"),
              Page.RouteData.Values("year"),
              Page.RouteData.Values("month"))

            'Load up Question DataSet
            For Each quest As Question In .Questions

                Dim tr As New HtmlControls.HtmlTableRow
                Dim td As New HtmlControls.HtmlTableCell
                td.Attributes.Add("class", "tdQ")       'Add class attribute to <td> element, creating 'class="tdQ"'
                Dim lbl As New Label
                lbl.ID = "lbl" & quest.ID
                lbl.Text = quest.Text

                td.Controls.Add(lbl)
                tr.Cells.Add(td)
                tblContent.Rows.Add(tr)

                tr = New HtmlControls.HtmlTableRow
                td = New HtmlControls.HtmlTableCell
                td.Attributes.Add("class", "tdA")       'Add class attribute to <td> element, creating 'class="tdA"'

                Dim rbl As New RadioButtonList
                rbl.ID = "rblT" & .ID & "_Q" & quest.ID
                AddHandler rbl.SelectedIndexChanged, AddressOf rbl_SelectedIndexChanged     'Attach generic event handler to control

                Dim li As New ListItem

                'Load up Answer Dataset
                For Each answ As Answer In quest.Answers
                    li.Text = answ.Value
                    li.Value = "T" & .ID & "-Q" & quest.ID & "-A" & answ.ID & "-C" & answ.Correct

                    'Add built ListItem to RadioButtonList
                    rbl.Items.Add(li)
                    li = New ListItem
                Next

                td.Controls.Add(rbl)
                tr.Cells.Add(td)
                tblContent.Rows.Add(tr)
            Next

        End With
        '
    End If

以下は、RadioButtonListにアタッチしようとしている汎用イベントハンドラロジックです。

Protected Sub rbl_SelectedIndexChanged(sender As Object, e As EventArgs)
    MsgBox(CType(sender, RadioButtonList).ID & " Clicked.")
    MsgBox("Radio Button Selected: " & CType(sender, RadioButtonList).ID & " is Correct? " & CType(sender, RadioButtonList).SelectedValue)
End Sub

誰かがデザインに何か問題があるのを見たり、イベントがトリガーされない理由を知っていますか?

2012年11月20日編集

OKはrblオブジェクトを変更しましAutoPostBack = trueたが、それは人生をさらに耐え難いものにしました;)その後、私が持っているQ&Aリストが質問と回答でランダムに生成されるのですぐに元に戻り、エンドユーザーはクリックするたびに新しいランダムな質問の順序が与えられますListItemの。

コールバックから応答が返されますが、JavaScript応答が返されませんが、定義されたJavaScriptファイルまたはインラインResponse.Write/のいずれかを使用して期待していますClientScript.Register

コンテンツページにデバッグメソッドを作成しました。

Public Shared Sub Show(msg As String, Optional pg As Page = Nothing)
    Dim cmsg As String = msg.Replace("'", "\'")
    Dim scr As String = "<script type=""text/javascript"">alert('" & cmsg & "');</script>"

    If pg Is Nothing Then
        pg = CType(HttpContext.Current.CurrentHandler, Page)
    End If

    If (pg IsNot Nothing) And Not (pg.ClientScript.IsClientScriptBlockRegistered("alert")) Then
        pg.ClientScript.RegisterClientScriptBlock(GetType(Alert), "alert", scr)
    End If
End Sub

ページのLoadで、このメソッドは期待どおりに起動しますが、SelectedIndexChangedイベント内に配置すると、起動しません。

一般的な実行では機能するが、実行がトリガーされない理由にはまだ戸惑っています。

Javascriptを実装する.Netメソッドを作成したい人のための便利なメソッド。.Net Slave-Javascript Alert.Show Class

4

1 に答える 1

1

あなたはそれを外に出さなければなりませんIf Not Page.IsPostBack Then

これは、ポストバックを行うと...

    AddHandler rbl.SelectedIndexChanged, AddressOf rbl_SelectedIndexChanged

...発砲する前にリバウンドする必要があります。

したがって、基本的に、およびを削除しIf Not Page.IsPostBack ThenますEnd If

ああ、MsgBox()コードも削除してください。これにより、ページは何も実行できなくなります。を出力したい場合は、次のAlert()ようにします。

    Dim script As String = String.Format("alert('{0}');", ""Radio Button Selected: " & CType(sender, RadioButtonList).ID & " is Correct? " & CType(sender, RadioButtonList).SelectedValue")
    page.ClientScript.RegisterClientScriptBlock(page.[GetType](), "alert", script, True)

アップデート:

AutoPostback = true;また、RBLに設定する必要があります。これにより、ページが変更されるとすぐにポストバックするように指示されます。ハンドラAutoPostBackは true の場合にのみ起動します。

于 2012-11-19T20:01:47.027 に答える