2015-04-30 11 views
11

Ho seguito alcune delle istruzioni per creare un nuovo LinkButton in fase di esecuzione con un trigger di evento e aggiungere un gestore di eventi per il LinkButton generato. Non ho idea del motivo per cui il nuovo LinkButton non attiva l'evento aggiunto ad esso. Qualcuno per favore guida/correggimi.Linkbutton generato dinamicamente non attiva evento Onclick VB.Net

Questo è quello che ho adesso.

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 
+0

Perché 'Dim caseNo As Long' quando si assegna un' Double'? La mia ipotesi è che abbia a che fare con un 'UpdatePanel'. – OneFineDay

+0

Ho provato a cambiare il tipo di caseNo come Double e inoltre non ha funzionato. –

+0

Non ho detto che avrebbe risolto il problema. Mi chiedo solo perché il tipo fosse diverso da come lo stavi impostando? Dovrebbe essere un 'Double' se questo è il tipo che ti serve. – OneFineDay

risposta

4

Quando si fa clic sul pulsante "Salva", salvare i dati sia in memoria locale o database e prova a caricare di nuovo la pagina per riempire la pagina con il contenuto dalla memoria. In questo caso, puoi avere il contenuto sulla pagina e così, puoi anche utilizzare gli eventi.

1

Ogni volta che si crea un controllo dinamico è necessario ricaricarla il postback. Sto usando ReloadRows metodo call() per la ricarica caso aggiunto che sto risparmiando in 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 
+0

Per ogni objCase As var In listCaseNo cosa intendi con 'var' qui? e anche il metodo "ReloadRows()" aggiunge una riga alla tabella ogni volta che il pannello viene aggiornato. Pannello può essere aggiornato con l'evento anche da altri elementi. –

+0

@GiriDharan puoi usare double invece di var. Ho fatto questo codice in C# e poi convertito in vb. – Sandeep

+0

Questo non funziona. –