Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET动态命令按钮事件未触发_Asp.net_Vb.net_Webforms_Button - Fatal编程技术网

ASP.NET动态命令按钮事件未触发

ASP.NET动态命令按钮事件未触发,asp.net,vb.net,webforms,button,Asp.net,Vb.net,Webforms,Button,我试图动态创建命令按钮,但单击有问题的按钮似乎不会引发相应的CommandButton\u Click事件。我注意到在上的示例中,为Button.OnCommand以及CommandName和CommandArgument设置了一个属性,但它不是intellisense中的选项 所以问题是,我在这里做错了什么(下面的代码没有OnCommand),它是以其他方式访问的吗?如果是,为什么我找到的示例都显示为.OnCommand 编辑:为了进一步提供帮助,我添加了处理程序,但是事件仍然没有触发。按钮位

我试图动态创建命令按钮,但单击有问题的按钮似乎不会引发相应的CommandButton\u Click事件。我注意到在上的示例中,为Button.OnCommand以及CommandName和CommandArgument设置了一个属性,但它不是intellisense中的选项

所以问题是,我在这里做错了什么(下面的代码没有OnCommand),它是以其他方式访问的吗?如果是,为什么我找到的示例都显示为.OnCommand

编辑:为了进一步提供帮助,我添加了处理程序,但是事件仍然没有触发。按钮位于UpdatePanel中,并在每次回发时重新生成(与处理程序一起)。我已经创建了一个我正在做的事情的简化示例,如下所示,如果按钮事件触发,它会将“事件触发”写入TXTESTFIELD文本框中——可以说我从未见过这样的情况。这真让我抓狂,我非常感激你的帮助

.aspx文件

<form id="frmMain" runat="server">
    <asp:ScriptManager ID="scmAddProducts" runat="server">
    </asp:ScriptManager>
    <asp:updatepanel runat="server">
        <ContentTemplate>
            <asp:TextBox ID="txtProduct" runat="server"></asp:TextBox>
            <br />
            <asp:Button ID="btnAddItem" runat="server" Text="Add Line" />&nbsp;
            <asp:TextBox ID="txtTestFired" runat="server"></asp:TextBox>
            <br />
            <br />
            <asp:Panel ID="pnlAddedLines" runat="server"></asp:Panel>
        </ContentTemplate>
    </asp:updatepanel>
</form>




.aspx.vb文件

Protected Sub btnAddItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddItem.Click
    Dim dtItems As New System.Data.DataTable

    If Session("Items") Is Nothing Then
        Dim dcColumn As New System.Data.DataColumn
        dcColumn.DataType = Type.GetType("System.String")
        dcColumn.ColumnName = "Product"
        dtItems.Columns.Add(dcColumn)
        Session("Items") = dtItems
    End If

    dtItems = CType(Session("Items"), System.Data.DataTable)
    Dim drRow As System.Data.DataRow
    drRow = dtItems.NewRow()
    drRow("Product") = txtProduct.Text
    dtItems.Rows.Add(drRow)

    Session("Items") = dtItems
    txtProduct.Text = ""
End Sub
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    If Not Session("Items") Is Nothing Then
        Dim dtItems As System.Data.DataTable = CType(Session("Items"), System.Data.DataTable)
        Dim iItemIndex As Integer = 1
        For Each drRow In dtItems.Rows
            Dim btnClose As New Button
            btnClose.ID = "btnClose" & iItemIndex
            btnClose.CssClass = "formCloseButton"
            btnClose.Text = "X"
            AddHandler btnClose.Click, AddressOf Button_Clicked
            pnlAddedLines.Controls.Add(btnClose)
            btnClose = Nothing

            Dim txtProduct = New TextBox
            txtProduct.ID = "txtProduct" & iItemIndex
            txtProduct.CssClass = "formText"
            txtProduct.Text = drRow("Product")
            txtProduct.Columns = "40"
            pnlAddedLines.Controls.Add(txtProduct)
            iItemIndex += 1

            Dim litHR = New Literal
            litHR.Text = "<hr />"
            pnlAddedLines.Controls.Add(litHR)
            litHR = Nothing
        Next
    End If
End Sub
Private Sub Button_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
    txtTestFired.Text = "EVENT FIRED"
End Sub
protectedsub btnAddItem\u Click(ByVal sender作为对象,ByVal e作为System.EventArgs)处理btnAddItem。Click
Dim dtItems作为新System.Data.DataTable
如果会话(“项目”)什么都不是,那么
Dim dcColumn作为新System.Data.DataColumn
dcColumn.DataType=Type.GetType(“System.String”)
dcColumn.ColumnName=“产品”
dtItems.Columns.Add(dcColumn)
会话(“项目”)=dtItems
如果结束
dtItems=CType(会话(“项”)、System.Data.DataTable)
Dim drRow作为System.Data.DataRow
drRow=dtItems.NewRow()
drRow(“产品”)=txtProduct.Text
dtItems.Rows.Add(drRow)
会话(“项目”)=dtItems
txtProduct.Text=“”
端接头
受保护的子页_PreRender(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.PreRender
如果不是,那么会话(“项目”)什么都不是
Dim dtItems As System.Data.DataTable=CType(会话(“项目”),System.Data.DataTable)
Dim iItemIndex为整数=1
对于dtItems.Rows中的每个drRow
将btnClose变暗为新按钮
btnClose.ID=“btnClose”&iItemIndex
btnClose.CssClass=“formCloseButton”
btnClose.Text=“X”
AddHandler btnClose.单击,按钮的地址已单击
pnlAddedLines.Controls.Add(btnClose)
btnClose=无
Dim txtProduct=新文本框
txtProduct.ID=“txtProduct”&iItemIndex
txtProduct.CssClass=“formText”
txtProduct.Text=drRow(“产品”)
txtProduct.Columns=“40”
pnlAddedLines.Controls.Add(txtProduct)
iItemIndex+=1
Dim litHR=新文本
litHR.Text=“
” pnlAddedLines.Controls.Add(litHR) 利特尔=没有 下一个 如果结束 端接头 已单击私有子按钮(ByVal sender作为对象,ByVal e作为System.EventArgs) txtTestFired.Text=“事件已激发” 端接头
你必须像这样把它连接起来(在C中):

或者,您可以像这样插入属性-->
onclick=“Button\u Clicked”

myButton.Attributes.Add("onclick", "Button_Clicked");
如果你想在VB.NET中使用它,那就自己动手吧——我可以帮你做,但重点是什么:)

编辑:请记住,每次加载页面时都必须重新连接事件处理程序(如上所示)


编辑:确定-添加了其余代码后,我看到了问题所在。您正在连接pre_render上的事件处理程序。事件处理程序在加载完成之前执行,加载完成发生在预渲染之前。这就是事件处理程序不执行的原因:在页面生命周期中添加它太晚了。将该代码放入页面加载例程中,它应该可以工作。

您需要连接单击事件。请参阅此代码

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim button1 As New Button
        Dim button2 As New Button

        button1.ID = "button1"
        button1.Text = "Button 1"
        button2.ID = "button2"
        button2.Text = "Button 2"

        AddHandler button1.Click, AddressOf OnClick
        AddHandler button2.Click, AddressOf OnClick

        form1.Controls.Add(button1)
        form1.Controls.Add(button2)

    End Sub

    Private Sub OnClick(ByVal sender As Object, ByVal e As System.EventArgs)

        Dim buttonId As String

        buttonId = DirectCast(sender, Button).ID

        Response.Write("Button clicked: " + buttonId)

    End Sub

End Class

希望这有帮助…

基本上,你需要在页面加载时创建原始控件,以便能够处理按钮单击,然后你需要清除控件并在按钮单击处理程序中重新生成它们,或者像你在预渲染时所做的那样-我认为在单击处理程序中更干净,因此,这两种方法都需要相同的代码(最好重构为单独的方法)

下面的示例意味着您的代码更改最少:

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    If Not Session("Items") Is Nothing Then
        pnlAddedLines.Controls.Clear()
        GenerateControls()
    End If
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Session("Items") Is Nothing Then
        GenerateControls()
    End If
End Sub
Private Sub GenerateControls()
    Dim dtItems As System.Data.DataTable = CType(Session("Items"), System.Data.DataTable)
    Dim iItemIndex As Integer = 1
    For Each drRow In dtItems.Rows
        Dim btnClose As New Button
        btnClose.ID = "btnClose" & iItemIndex

我也遇到了同样的问题,我加载的控件很好。这些事件是第一次,但不是第二次。问题是我没有一个与控件关联的唯一标识符。因此,我在添加到页面的控件中添加了一个唯一的ID字段,每次单击都可以正常工作。

正确的方法是:

  • OnLoad-生成动态内容(创建动态按钮)
  • 按钮OnClick-使用事件并重新生成正确的内容
  • 但它需要生成两次内容,一次用于创建按钮处理事件,然后擦除旧内容并生成正确的一秒钟。您可以这样解决它:

    myButton.Attributes.Add("onclick", "Button_Clicked");
    
  • OnLoad-检查是否单击了buton
  • PreRender-使用动态按钮生成正确的内容(仅生成一次内容)
  • 我的例子是:

    <script type="text/javascript" language="javascript">
        function SetPostBackAction(Action,ReturnValue)
        {
            if(ReturnValue)
                document.getElementById('<%=hfPostBackAction.ClientID%>').value=Action;
            return ReturnValue;
        }
    </script>
    <asp:HiddenField ID="hfPostBackAction" EnableViewState="false" runat="server" />
    

    这是C#,不是你在VB.NET中的做法你转到这个URL-->:)如果你不能自己花13秒找出细微的语法差异,上帝会帮助你的客户。我看到你在回答中花了时间这么做。。。谈论实践你所宣扬的:)@Johnldol实际上,我是指Chackey关于答案不在VB中的评论。我的观点是,“如果你不能把这么小的东西从C#移植到VB,那么你需要解决的问题就比让事件触发更大。”这更像是开玩笑的评论。我认为你个人超越了发布转换器。实际上我是目前唯一一个拥有vo的人
    protected void Page_PreRender(object sender, EventArgs e)
    {
        //Dynamic button in PreRender
        System.Web.UI.WebControls.Button btn=new System.Web.UI.WebControls.Button()
        btn.ID=string.Format("DeleteButton_SomeData{0}", 12345);
        btn.Text="Delete";
        btn.OnClientClick=string.Format("return SetPostBackAction('DeleteButton_SomeData{0}',window.confirm('Are you sure to delete?'))", 12345);
        btn.Click+=new EventHandler(btnDelete_Click);//This method will not be called if button is created in PreRender
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        //Do something...
        //Check Action
        ProccessAction();//You can check action whereever you want
    }
    
    protected void ProccessAction()
    {
        string Action=Request.Form[hfPostBackAction.UniqueID]??string.Empty;
        int SomeData;
    
        if(Action.StartsWith("DeleteButton_"))//Is action?
        {
            SomeData=int.Parse(Action.Substring("DeleteButton_SomeData".Length));
            //Do something...
        }
        //Erase Action field not to fire action next time accidentially
        hfPostBackAction.Value=string.Empty;
    }