2011-11-21 28 views
3

我有一個GridView,它不斷地使用計時器反彈,並在一個updatePanel內,因此頁面不會持續刷新(每一行都有一個倒計時序列,因此GridView需要不斷地刷新得到更新)asp.ImageButton GridView中的OnClick函數在一個updatePanel內

在gridview裏面我有一個帶有OnClick方法的imagebutton。以前爲了讓OnClick方法觸發,我會確保gridView不在UpdatePanel中,並且gridview的pageload數據綁定位於「If Not IsPostBack」中。

隨着計時器,雖然我不能有一個「如果不IsPostBack」GridView綁定,它需要在一個UpdatePanel。

有沒有辦法使用UpdatePanel和「如果不是IsPostBack」,仍然可以調用OnClick方法?

感謝

下面是一些代碼,如果我的解釋沒有做出完整意義上的:

的UpdatePanel /定時器/ GridView的

<asp:UpdatePanel runat="server"> 
<ContentTemplate> 
<asp:Timer ID="timerCountDown" runat="server" Interval="1000" OnTick="timerCountDown_Tick"></asp:Timer> 
<asp:GridView ID="gridBuildQueue" runat="server" AutoGenerateColumns="False" 
        GridLines="none" ShowFooter="false" ShowHeader="false" Width="100%"> 
        <Columns> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:ImageButton runat="server" ID="cmdCancelBuild" ImageUrl="~/images/cancel.jpg" OnClick="ImageButton_Click"/> 
          </ItemTemplate> 
         </asp:TemplateField> 
        </Columns> 
     </asp:GridView> 
     </ContentTemplate> 
</asp:UpdatePanel> 

OnTick計時器方法:

Protected Sub timerCountdown_Tick(ByVal sender As Object, ByVal e As EventArgs) 
    Me.gridBuildQueue.DataBind() 
End Sub 

ImageButton_Click方法(目前從未調用過):

Protected Sub ImageButton_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs) 
    Dim imageButton As ImageButton = CType(sender, ImageButton) 
    Dim row As GridViewRow = CType(imageButton.NamingContainer, GridViewRow) 
    Dim button As ImageButton = DirectCast(row.FindControl("cmdCancelBuild"), ImageButton) 
etc... 
End Sub 

回答

3

您需要使用GridView控制事件,尤其是 - RowCommand事件。

<asp:UpdatePanel runat="server"> 
    <ContentTemplate> 
    <asp:GridView 
      ID="gridBuildQueue" 
      runat="server" 
      AutoGenerateColumns="False" 
      GridLines="none" 
      ShowFooter="false" 
      ShowHeader="false" 
      Width="100%" 
      onrowcommand="gridBuildQueue_RowCommand" 
      > 
       <Columns> 
       <asp:TemplateField> 
       <ItemTemplate> 
        <asp:ImageButton 
          runat="server" 
          ID="cmdCancelBuild" 
          ImageUrl="~/images/cancel.jpg" 
          CommandName="cmd"/> 
        </ItemTemplate> 
       </asp:TemplateField> 
       </Columns> 
    </asp:GridView> 
    </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="gridBuildQueue" EventName="RowCommand" /> 
     </Triggers> 
    </asp:UpdatePanel> 

後面的代碼:

protected Sub gridBuildQueue_RowCommand(ByVal sender As Object,ByVal e as GridViewCommandEventArgs) 
    if e.CommandName="cmd" Then 

    .... 
    End If 
End sub 

除了RowCommand事件,您必須增加對RowCommand事件AsyncPostBackTrigger項。 (設置UpdatePanel.Triggers集合)。

DEMO:

標記

<div> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
</div> 
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> 
      <Columns> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:ImageButton ID="ImageButton1" runat="server" /> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
     <asp:Timer ID="Timer1" runat="server" Interval="1000"> 
     </asp:Timer> 
     <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="GridView1" EventName="RowCommand" /> 
     <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" /> 
    </Triggers> 
</asp:UpdatePanel> 

代碼隱藏

Dim lst As New List(Of String) 
    Protected Sub GridView1_RowCommand(sender As Object, e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand 
     Label1.Text = DateTime.Now 
    End Sub 

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
     If Not IsPostBack Then 
      If IsNothing(Session("lst")) Then 
       Session("lst") = lst 
      End If 
      GridView1.DataSource = lst 
      GridView1.DataBind() 
     End If 
    End Sub 

    Protected Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick 
     lst = Session("lst") 
     lst.Add(DateTime.Now.ToString()) 
     GridView1.DataSource = lst 
     GridView1.DataBind() 
    End Sub 
+0

好吧,我只是改變使用rowCommand代替的OnClick,但同樣的事情發生,gridBuildQueue_RowCommand方法永遠不會被調用。 updatePanel會干擾這個嗎?感謝您的幫助 – jdtaylor

+0

@jdtaylor - 您需要設置更新面板的「觸發器」集合。 – adatapost

+0

謝謝,我已經添加了觸發器,並允許rowCommand現在被調用,但因爲我沒有一個「如果不是IsPostBack」圍繞我的GridView的第一個DataBind()我收到一個無效的回發/回調錯誤(錯誤在下面複製)。如果我添加「如果不是IsPostBack」,那麼錯誤頁面不會出現,但gridview永遠不會被定時器反彈。有任何想法嗎?謝謝! – jdtaylor

相關問題