2015-08-03 3 views
0

У меня есть 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 не называется.

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

ответ

0

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

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

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

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

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) 

UPDATE (испытано)

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 

A демонстрационный проект here

+0

Я использую Site.Master, который содержит ScriptManager. Я заменил ваш код 'Dim myScriptManager As ScriptManager = Page.Master.FindControl (« CPScriptManager ») myScriptManager.RegisterAsyncPostBackControl (cmdNew)', но он все еще очищает сетку, когда я нажимаю на элемент управления, и не запускаю функцию для обработки события. –

+0

Я обновил свой ответ, и я разместил соответствующий код и ссылку для фиктивной демонстрации. – davcs86

Смежные вопросы