Динамически созданные кнопки не запускают рутину

У меня есть gridview с шаблоном столбца:

<asp:UpdatePanel runat="server">  
 <ContentTemplate>  
  <asp:GridView ID="gridDay" runat="server" SkinID="gridviewSkinLight" AutoGenerateColumns="False" DataSourceID="DSAppointmentForDay">  
   <Columns>  
    <asp:BoundField DataField="TimeValue" HeaderText="" InsertVisible="False" ReadOnly="True" SortExpression="TimeValue" />  
    <asp:TemplateField HeaderText=" ">  
     <ItemStyle HorizontalAlign="Left" />  
    </asp:TemplateField>  
   </Columns>  
  </asp:GridView>  
 </ContentTemplate>  
 <Triggers>  
  <asp:AsyncPostBackTrigger ControlID="gridDay" />  
 </Triggers>  
</asp:UpdatePanel>  

На RowDataBound я создаю кнопки в ячейке, если найдены данные, соответствующие условию:

Dim cmdNew As New Button  
cmdNew.ID = "E" & dr("pkAppointment") & "|" & dr("ApptTopic")  
AddHandler cmdNew.Click, AddressOf mySub  
cmdNew.Text = dr("ApptTopic") & " >> " & dr("ApptLocation")  
cmdNew.ToolTip = "Topic: " & dr("ApptTopic") & vbLf &
                 "Location: " & dr("ApptLocation")  
e.Row.Cells(1).Controls.Add(cmdNew)  

До здесь все отлично. Кнопки созданы в правой ячейке со всеми их наворотами.

Процедура, которую должна вызвать кнопка:

Private Sub mySub(sender As System.Object, e As System.EventArgs)
    Try
        Dim btn As Button = DirectCast(sender, Button)
        MsgBox(btn.Text)

    Catch ex As Exception

    End Try
End Sub  

В тот момент, когда я нажимаю на кнопку, страница обновляется, все созданные кнопки исчезают и mySub не вызывается.

Я что-то пропустил?

1 ответ

Попробуй это,

1) Добавить ScriptManager,

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

2) Создать кнопки на OnRowCreated событие сетки просмотра, зарегистрируйте кнопки в качестве элемента управления.

Dim cmdNew As New Button  
cmdNew.ID = "E" & dr("pkAppointment") & "|" & dr("ApptTopic")  
cmdNew.Text = dr("ApptTopic") & " >> " & dr("ApptLocation")  
cmdNew.ToolTip = "Topic: " & dr("ApptTopic") & vbLf &
                 "Location: " & dr("ApptLocation") 

ScriptManager1.RegisterAsyncPostBackControl(cmdNew) 
e.Row.Cells(1).Controls.Add(cmdNew)  

AddHandler cmdNew.Click, AddressOf mySub  
ScriptManager.GetCurrent(Me).RegisterAsyncPostBackControl(cmdNew)

ОБНОВЛЕНИЕ (проверено)

1) Поскольку у вас уже есть ScriptManager на главной странице, вам не нужен новый.

2) с UpdatePanel, как это

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="CreateButtons" >
            <Columns>
                <asp:BoundField DataField="Code" /> <!-- example column -->
                <asp:BoundField DataField="Text" /> <!-- example column -->
                <asp:CommandField />
            </Columns>
        </asp:GridView>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="GridView1"/>
    </Triggers>
</asp:UpdatePanel>

3) В вашем коде, создайте кнопки в OnRowDataBound и зарегистрируйте кнопки в ScriptManagerс чем-то вроде этого

Protected Sub CreateButtons(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim cmdNew As New Button
        cmdNew.ID = "Button" & e.Row.RowIndex
        cmdNew.Text = "Button" & e.Row.RowIndex
        cmdNew.ToolTip = "Button" & e.Row.RowIndex

        AddHandler cmdNew.Click, AddressOf CmdNewOnClick

        e.Row.Cells(2).Controls.Add(cmdNew)
        Dim myScriptManager As ScriptManager = Page.Master.FindControl("ScriptManager1")
        myScriptManager.RegisterAsyncPostBackControl(cmdNew)

    End If

End Sub

Private Sub CmdNewOnClick(ByVal sender As Object, ByVal e As EventArgs)
    Dim buttonClicked As Button = sender
    Debug.WriteLine("-----------------------------------------------")
    Debug.WriteLine("Button clicked:" & buttonClicked.ID)
    Debug.WriteLine("-----------------------------------------------")
End Sub

Демо-проект доступен здесь

Другие вопросы по тегам