Динамически генерируемая кнопка Linkbutton не запускает событие Onclick VB.Net

Я выполнил некоторые инструкции, чтобы создать новый LinkButton во время выполнения с триггером события и добавить обработчик событий для сгенерированного LinkButton. Я понятия не имею, почему новый LinkButton не запускает добавленное к нему событие. Кто-нибудь, пожалуйста, направьте / поправьте меня.

Это то, что у меня есть прямо сейчас.

ASPX:

<form id="myForm" runat="server">
 <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">

 <ContentTemplate>

 <table class="mel-table" style="text-align: center" runat="server" id="mytab1">

    <tbody>
        <tr>
            <td>Case Number :</td>

            <td>
            <asp:TextBox ID="caseNumber" runat="server"></asp:TextBox>
            </td>

        </tr>

    </tbody>
  </table>

   <asp:Button OnClick="btnOK1_Click" ID="btnOK1" runat="server" Text="Save" />

  </ContentTemplate>

  </asp:UpdatePanel>
 </form>

ASPX.VB:

Protected Overloads Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Session("tablecontent") IsNot Nothing Then
        mytab1 = CType(Session("tablecontent"), HtmlTable)
    End If
End Sub

Public Function checking() As Boolean

        Dim caseNo As Double
            Try
                caseNo = Convert.ToDouble((caseNumber.Text).Trim())
            Catch ex As Exception
            caseNo = 0
            End Try

        Dim r As New HtmlTableRow
        Dim c0 As New HtmlTableCell
        r.Cells.Add(c0)

        Dim but As New LinkButton
        but.ID = caseNo 
        but.Text = caseNo.ToString() 
        AddHandler but.Click, AddressOf LinkButton1_Click
        c0.Controls.Add(but)

        mytab1.Rows.Add(r)
        Session("tablecontent") = mytab1
        Return True
End Function

Protected Sub LinkButton1_Click(sender As Object, e As EventArgs)

    'My Code here

End Sub

Protected Sub btnOK1_Click(sender As Object, e As EventArgs)

    If (checking()) Then

        ScriptManager.RegisterStartupScript(Page, Page.GetType, "Alert", "<script type='text/javascript'>alert('Success');</script>", False)

    End If

End Sub

person Giri Dharan    schedule 30.04.2015    source источник
comment
Почему Dim caseNo As Long, когда вы присваиваете ему Double? Я предполагаю, что это связано с тем, что он находится в UpdatePanel.   -  person OneFineDay    schedule 30.04.2015
comment
Я попытался изменить тип caseNo на Double, но это не сработало.   -  person Giri Dharan    schedule 30.04.2015
comment
Я не сказал, что это решит проблему. Просто интересно, почему тип отличался от того, который вы его устанавливали? Это должно быть Double, если это тот тип, который вам нужен.   -  person OneFineDay    schedule 30.04.2015
comment
На Postback этот элемент управления и делегат не существуют.   -  person OneFineDay    schedule 30.04.2015
comment
Я ошибся в этой части. Но не могли бы вы мне помочь, как это преодолеть?   -  person Giri Dharan    schedule 30.04.2015
comment
В событии загрузки страницы у вас должен быть носитель, на котором вы можете загружать их, будь то база данных, переменная сеанса и т. Д., И загружать их на страницу. Таким образом, он все еще может существовать.   -  person OneFineDay    schedule 30.04.2015
comment
убедитесь, что check () вызывается для каждой обратной передачи, иначе динамическое управление будет недоступно после обратной передачи на экране   -  person Sandeep    schedule 30.04.2015
comment
Все элементы находятся внутри UpdatePanel. Значит, для всей страницы постбека не будет. Постбек происходит только внутри панели. Когда я нажимаю кнопку «Сохранить», я добавляю новую кнопку в таблицу. Если я попытаюсь нажать на эту кнопку, панель обновится, и кнопка исчезнет. Как с этим справиться?   -  person Giri Dharan    schedule 30.04.2015
comment
@GiriDharan попробуйте добавить наконец UpdatePanel1.ContentTemplateContainer.Controls.Add(mytab1); в функцию Checking ()   -  person Sandeep    schedule 30.04.2015
comment
@Sandeep: при этом будет добавлена ​​таблица с новым содержимым. Мой запрос - вызвать событие linkbutton_click из только что добавленной кнопки. Я пробовал делать то, что тоже не помогает.   -  person Giri Dharan    schedule 30.04.2015
comment
Функция check () не возвращает значение, сначала исправьте это.   -  person Top Systems    schedule 04.05.2015
comment
Я обновил check (), чтобы вернуть значение.   -  person Giri Dharan    schedule 04.05.2015


Ответы (2)


Когда вы нажимаете кнопку «Сохранить», сохраняете данные в локальном хранилище или базе данных и снова пытаетесь загрузить страницу, чтобы заполнить страницу содержимым из хранилища. В этом случае у вас может быть контент на странице, а значит, вы также можете использовать события.

person Giri Dharan    schedule 04.05.2015

Каждый раз, когда вы создаете динамический элемент управления, вы должны перезагружать его при обратной передаче. Я использую вызов метода ReloadRows () для перезагрузки добавленного кейса, который я сохраняю в ViewState:

        <asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional" >
            <ContentTemplate>
                <asp:Table class="mel-table" style="text-align: center" runat="server" id="mytab1">
                    <asp:TableRow>
                        <asp:TableCell>Case Number :</asp:TableCell>
                        <asp:TableCell>
                            <asp:TextBox ID="caseNumber" runat="server"></asp:TextBox>
                        </asp:TableCell>
                    </asp:TableRow>
                </asp:Table>
                <asp:Button OnClick="btnOK1_Click" ID="btnOK1" runat="server" Text="Save" />
            </ContentTemplate>
        </asp:UpdatePanel>

--------------------------------------------------------------------------------------------------------

Public Partial Class _Default
    Inherits System.Web.UI.Page

    Private listCaseNo As List(Of Double) = Nothing

    Protected Sub Page_Init(sender As Object, e As EventArgs)

    End Sub


    Protected Sub Page_Load(sender As Object, e As EventArgs)
        If ViewState("ListCases") IsNot Nothing Then
            listCaseNo = DirectCast(ViewState("ListCases"), List(Of Double))
        Else
            listCaseNo = New List(Of Double)()
        End If

        ReloadRows()
    End Sub

    Public Function checking() As Boolean

        Dim caseNo As Double = 0
        Try
            caseNo = Convert.ToDouble((caseNumber.Text).Trim())
        Catch ex As Exception
            caseNo = 0
        End Try

        Dim r As New TableRow()
        Dim c0 As New TableCell()
        r.Cells.Add(c0)

        Dim but As New LinkButton()
        but.ID = Convert.ToString(caseNo)
        but.Text = caseNo.ToString()
        AddHandler but.Click, AddressOf LinkButton1_Click
        c0.Controls.Add(but)

        mytab1.Rows.Add(r)

        listCaseNo.Add(caseNo)

        ViewState("ListCases") = listCaseNo

        Return True
    End Function


    Private Sub ReloadRows()
        For Each objCase As var In listCaseNo
            Dim r As New TableRow()
            Dim c0 As New TableCell()
            r.Cells.Add(c0)

            Dim but As New LinkButton()
            but.ID = Convert.ToString(objCase)
            but.Text = objCase.ToString()
            AddHandler but.Click, AddressOf LinkButton1_Click
            c0.Controls.Add(but)

            mytab1.Rows.Add(r)
        Next
    End Sub

    Protected Sub LinkButton1_Click(sender As Object, e As EventArgs)
        'My Code here

    End Sub


    Protected Sub btnOK1_Click(sender As Object, e As EventArgs)


        If (checking()) Then
        End If

    End Sub

End Class
person Sandeep    schedule 30.04.2015
comment
Для каждого objCase Как var В listCaseNo, что вы здесь подразумеваете под словом «var»? а также метод ReloadRows () добавляет строку в таблицу при каждом обновлении панели. Панель также может обновляться событиями из других элементов. - person Giri Dharan; 30.04.2015
comment
@GiriDharan вы можете использовать double вместо var. Я написал этот код на C #, а затем преобразовал в vb. - person Sandeep; 30.04.2015