0

开发了一个稍微动态的页面,该页面基于数据库中的信息构建了一个问答页面。一切都很好,除了我无法让 RadioButtonList 事件触发一个次要的 MsgBox 响应来验证对象发送者和选定的 ListItem 信息。

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(s) 的通用事件处理程序逻辑。

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 编辑

好的,更改了rbl要执行的对象,AutoPostBack = true但这使生活更加难以忍受;)然后迅速恢复为我的问答列表是在问题和答案中随机生成的,因此最终用户将在每次点击时获得新的随机问题顺序的列表项。

尽管我从回调中得到了一些响应,但仍然没有通过使用定义的 JavaScript 文件或内联Response.Write/得到我期望的 JavaScript 响应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

在页面加载此方法按预期触发,但当放置在 SelectedIndexChanged 事件中时,它永远不会触发。

仍然对为什么它适用于一般执行而不是触发执行感到困惑。

适合那些喜欢创建实现 Javascript 的 .Net 方法的用户的有用方法。.Net Slave - Javascript Alert.Show 类

4

1 回答 1

1

你必须把它从If Not Page.IsPostBack Then

这是因为当您进行回发时,...

    AddHandler rbl.SelectedIndexChanged, AddressOf rbl_SelectedIndexChanged

...需要反弹才能发射。

所以基本上,删除If Not Page.IsPostBack Thenand 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为真时触发。

于 2012-11-19T20:01:47.027 回答