Динамически созданные кнопки не запускают рутину
У меня есть 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
Демо-проект доступен здесь