【问题标题】:Event won't fire to dynamically added control事件不会触发动态添加的控制
【发布时间】:2019-05-23 18:54:22
【问题描述】:

我正在根据服务器文件夹上的视频数量动态地将 htmlvideo 控件添加到我的 Web 表单中。这部分工作正常。所有视频都会显示并且可以播放。我在后面的代码中添加了“onended”事件作为属性和函数,但是这个事件不会触发。我知道,由于这些控件是在我必须添加一个侦听器之后添加的,但只是不知道如何。

这是添加控件的代码

    Dim SavePath As String = "e:\ftproot\images\TechNet\"
    Dim Directory As New DirectoryInfo(SavePath)
    Dim allFiles As IO.FileInfo() = Directory.GetFiles("*.mov")
    Dim VidCtr As Integer = 1
    For Each singlefile In allFiles
        Dim myVid As New HtmlVideo
        myVid.Src = "https://www.rawauto.com/images/TechNet/" & singlefile.Name
        myVid.Attributes.Add("height", 140)
        myVid.Attributes.Add("runat", "server")
        myVid.Attributes.Add("type", "video/mp4")
        myVid.Attributes.Add("controls", "controls")
        myVid.Attributes.Add("onended", "VidPlayed")
        myVid.Attributes.Add("id", "Vid" & VidCtr)
        Panel1.Controls.Add(myVid)

        Dim myLbl As New Label
        myLbl.Text = Replace(UCase(singlefile.Name), ".MOV", "")
        myLbl.Width = 250
        myLbl.CssClass = "VidStyle"
        myLbl.Font.Name = "calabri"
        myLbl.Font.Bold = True
        LPanel.Controls.Add(myLbl)
    Next

这是我在用户看完视频后尝试触发的功能:

Protected Sub VidPlayed(sender As Object, e As EventArgs)
    Dim Tech As New SqlConnection("server=RAW-OTT; Initial Catalog=TechNet; Integrated Security=True;")
    Dim vid As HtmlVideo = sender
    Dim vidurl As String = vid.Src
    VidName = Replace(vidurl, "https://www.rawauto.com/images/TechNet/", "")
    If Len(VidName) > 50 Then
        VidName = Mid(VidName, 1, 50)
    End If
    Dim SqlStr As String = "Select * From TechTube Where Video = '" & VidName & "'"
    Dim ttA As New SqlDataAdapter(SqlStr, Tech)
    Dim ttT As New DataTable
    ttA.Fill(ttT)
    If ttT.Rows.Count = 0 Then
        SqlStr = "Insert Into TechTube Values ('" & VidName & "', 1, 0)"
        Dim tCmd As New SqlCommand(SqlStr, Tech)
        Tech.Open()
        tCmd.ExecuteNonQuery()
        Tech.Close()
    Else
        SqlStr = "Update TechTube Set Hits = Hits + 1 Where Video = '" & VidName & "'"
        Dim tCmd As New SqlCommand(SqlStr, Tech)
        Tech.Open()
        tCmd.ExecuteNonQuery()
        Tech.Close()
    End If
    RateLabel.Visible = True
    RatingBox.Visible = True
End Sub

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

    这是 any 动态控件的旧 ViewState 问题,与视频无关。

    请记住,每个 PostBack 都会从头开始重建整个页面,包括您的动态控件。如果在回发(包括所有服务器事件)后仍希望看到这些控件,则必须将它们重新添加到页面中。此外,如果您希望在此 PostBack 期间为控件触发事件,则需要恢复控件的 ViewState,并且必须在 Page_Load 事件运行之前将要恢复控件的 ViewState 添加回重建的页面。 Page_Init 或 Page_PreInit 可以很好地解决这个问题。

    最后,考虑这里的性能影响。你真的想要在每次用户交互时重建整个页面,或者是时候学习使用 javascript 来处理这些事情了,也许是一个 web api 只需要接收一个 javascript 请求而无需在您的服务器和用户的浏览器中导致整个页面循环?

    这只是被问及回答的许多次中的一小部分:

    【讨论】:

    • 给其他人的注意事项:我完全回答了这个问题,而不是投票关闭作为重复问题,所以我将来会有更好的地方用作重复问题。
    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多