我有一个 GridView,它使用计时器不断反弹,并且位于 updatePanel 内,因此页面不会持续刷新(每行都有一个倒计时序列,因此 gridview 需要不断更新)
在 gridview 中,我有一个带有 OnClick 方法的图像按钮。以前,为了触发 OnClick 方法,我会确保 gridView 不在 UpdatePanel 中,并且 gridview 的页面加载数据绑定(bind)位于“If Not IsPostBack”中。
使用计时器,虽然我无法让 gridview 绑定(bind)“If Not IsPostBack”,但它需要位于 UpdatePanel 中。
有没有办法使用 UpdatePanel 和“If Not IsPostBack”并仍然调用 OnClick 方法?
谢谢
如果我的解释没有完全有意义,这里是一些代码:
更新面板/计时器/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
最佳答案
您需要使用 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集合)。
演示:
标记
<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
关于asp.net - updatePanel 内 GridView 内的 asp.ImageButton OnClick 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8220006/