首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >事件不会触发到动态添加的控件

事件不会触发到动态添加的控件
EN

Stack Overflow用户
提问于 2019-05-24 02:54:22
回答 1查看 88关注 0票数 0

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

这是添加控件的代码

代码语言:javascript
复制
    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

这是我试图在用户看完视频后触发的函数:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-05-24 03:10:18

这是一个老的ViewState问题,用于任何动态控件,与视频无关。

请记住,every PostBack从头开始重新构建整个页面,包括动态控件。如果在回发(包括所有服务器事件)后仍希望看到这些控件,则必须将它们重新添加到页中。此外,如果希望在此PostBack期间为控件激发事件,则需要还原控件的ViewState,并且为了让ViewState还原控件,必须在 Page_Load事件运行之前将控件添加回重新构造的页。对于这一点,Page_Init或Page_PreInit可以很好地工作。

最后,考虑这里的性能影响。你真的想在每次用户交互时重新构建整个页面吗?或者现在是时候学习使用javascript来处理这些事情了,也许web api只需要接收一个javascript请求,而不会在服务器和用户的浏览器上造成整个页面周期?

这只是许多其他问题和答案中的一小部分:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56281364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档