我在点击搜索imgButton时尝试在asp.net中填充gridView。问题是每当我点击此按钮时,页面在到达处理搜索点击的事件之前进入加载事件。我找到了一些解决方案:
我找到了一个类似的解决方案:
如果没有回发那么
做点什么..
否则
做别的事。
结束IF
但页面仍然刷新并且正在加载事件中进入。
我尝试设置causeValidation = false但仍然达到了加载事件
我还尝试将gridView更改为AjaxData GridView,并从javascript函数调用webservice来填充我的新Grid View,但我现在面临设计中的AjaxData错误,分页DataSource ......和我找不到有用的文件......
那么如何在不加载我的页面的情况下获取数据并填充我的gridView? 在进行上述更改之前,下面是我的代码:
<table>
<tr>
<td>
<asp:ImageButton ID="btnSearch" runat="server" ImageUrl="~/SEARCH.GIF" CausesValidation="True" ValidationGroup="GroupSearch" />
</td>
</tr>
<tr>
<td>
<asp:GridView ID="grdvUserInfo" AllowPaging="True" PagerSettings-Mode="NextPreviousFirstLast" PageSize="20" runat="server" AutoGenerateColumns="False" Width="700px" SkinID="grdMySite" DataSourceID="ObjectDataSource1">
<Columns>
<asp:BoundField DataField="UserID" Visible="false" HeaderText="UserID" SortExpression="UserID" />
<asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
<asp:BoundField DataField="ProviderName" HeaderText="ProviderName" SortExpression="ProviderName" />
<asp:BoundField DataField="IpAddress" HeaderText="IpAddress" SortExpression="IpAddress" />
<asp:BoundField DataField="TimeIn" HeaderText="TimeIn" SortExpression="TimeIn" />
<asp:BoundField DataField="TimeOUt" HeaderText="TimeOUt" SortExpression="TimeOUt" />
</Columns>
</asp:GridView>
</td>
</tr>
</table>
在codeBehind:
Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
Try
If Page.IsValid Then
provider = New DataProvider
Me.grdvUserInfo.DataSource = provider.ShowLoginUser(_userName, _providerName, _ip, _dateTimeInFrom, _dateTimeInTo, 0, 20)
Me.grdvUserInfo.DataSourceID = ""
Me.grdvUserInfo.DataBind()
provider.Dispose()
End If
Catch ex As Exception
End Try
End Sub
我非常感谢任何帮助...
答案 0 :(得分:1)
您需要知道的第一件事是页面的生命周期如何在ASP .NET Web窗体中运行。检查Page Life Cycle。有了这个&#34;规则&#34;请记住,每次单击搜索按钮时,都会执行以下方法:
1)Page pre init
2)Page init
3)页面初始化
4)页面预加载
5)页面加载
6)事件控制。那是你的btnSearch_Click方法(尤里卡!)
在这种情况下,您不必担心1-4中的事件。但是你应该在你的Page_Load事件中执行以下操作,这样内部代码就不会执行多次:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Do things only when page loads for the first time.
}
}
所以它只是将代码的执行跳到页面生命周期的下一步(6,Event Control,又名btnSearch_Click)。
考虑到这些步骤,我建议您使用Microsoft Ajax套件,特别是ASP .NET控件Update Panel,它将使您在gridview中搜索数据而不加载整个页面。
完整代码如下所示:
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<table>
<tr>
<td>
<asp:ImageButton ID="btnSearch" runat="server" ImageUrl="~/SEARCH.GIF" CausesValidation="True" ValidationGroup="GroupSearch" />
</td>
</tr>
<tr>
<td>
<asp:UpdatePanel ID="UpdatePanelGridViewSearch" runat="server">
<ContentTemplate>
<asp:GridView ID="grdvUserInfo" AllowPaging="True" PagerSettings-Mode="NextPreviousFirstLast" PageSize="20" runat="server" AutoGenerateColumns="False" Width="700px" SkinID="grdMySite" DataSourceID="ObjectDataSource1">
<Columns>
<asp:BoundField DataField="UserID" Visible="false" HeaderText="UserID" SortExpression="UserID" />
<asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
<asp:BoundField DataField="ProviderName" HeaderText="ProviderName" SortExpression="ProviderName" />
<asp:BoundField DataField="IpAddress" HeaderText="IpAddress" SortExpression="IpAddress" />
<asp:BoundField DataField="TimeIn" HeaderText="TimeIn" SortExpression="TimeIn" />
<asp:BoundField DataField="TimeOUt" HeaderText="TimeOUt" SortExpression="TimeOUt" />
</Columns>
</asp:GridView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlId="btnSearch" EventName="Click"/>
</Triggers>
</asp:UpdatePanel>
</td>
</tr>
</table>
要使用UpdatePanel控件,您必须包含ScriptManager控件,如果要指示谁是进行异步回发的控件,则应使用AsyncPostbackTrigger属性。
如果您真的想要跳过生命周期(Page_Load事件和其他事件),还有另一种解决方法。
您可以使用Web方法,Web方法是服务器端可以通过javascript访问的方法,您甚至可以访问数据库,但是这些Web方法中没有ViewState,因为它们是静态的,所以您无法直接访问制作DataSource或Databind的网格。您可以尝试通过ajax调用WebMethod,然后在javascript中填充您的网格,但这很复杂,我会建议您按原样吞下页面生命周期。请查看此Web方法示例以获取更多信息:Calling ASP.Net WebMethod using jQuery AJAX