GridView的PreRender事件解决

来源:互联网 发布:ps制作淘宝宝贝描述 编辑:程序博客网 时间:2024/05/22 06:22
 

有时候用GridView,DataPager配合使用绑定数据库,总算把数据库的数据读取出来,并且有‘首页-上一页-下一页-末页’显示,但是发现点击‘首页-上一页-下一页-末页’这些按钮的时候,总要点击两次。其实解决的方法很简单,只需在GridView的PreRender事件再绑定数据库一次即可。

因为页面先执行Page_Load,然后再GridView_PreRender。

下面请看详细例子:

一,前台页面的

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>GridView的应用</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView2" runat="server" onprerender="GridView2_PreRender">
            <Columns>
                <asp:TemplateField HeaderText="Id">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Id") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Name">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
       
        </asp:GridView>
       
        <asp:DataPager ID="DataPager1" PagedControlID="GridView2" PageSize="15" runat="server">
                <Fields>
                    <asp:NextPreviousPagerField FirstPageText="首页" ShowPreviousPageButton="true" ShowLastPageButton="false"
                        ShowNextPageButton="false" ShowFirstPageButton="true" />
                    <asp:NumericPagerField />
                    <asp:TemplatePagerField>
                    </asp:TemplatePagerField>
                    <asp:NextPreviousPagerField LastPageText="末页" ShowFirstPageButton="false" ShowNextPageButton="true"
                        ShowPreviousPageButton="false" ShowLastPageButton="true" />
                </Fields>
            </asp:DataPager>
    </div>
    </form>
</body>
</html>

 

二,后台页面

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bind();
           
        }
    }
    public void bind() {
        GridView2.DataSource = UserInfoService.GetUserInfo();//这个是你在服务层写好获取用户的集合list
        GridView2.DataBind();
    }
    protected void GridView2_PreRender(object sender, EventArgs e)
    {
        bind();
    }
}

 

可是问题来了,如果你想要在此页面再进行另外操作,如如果你要查询的操作,发现点击‘首页-上一页-下一页-末页’这些按钮的时候,依然要点击两次。解决此种情况,你可以在后台定义一个全局变量bFlag来标识你进行的是哪一种操作,页面触发的是哪一种事件。例子如下:

一,前台页面添加一个文本框TextBox和按钮Button,代码如下:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Select" onclick="Button1_Click" /></div>
    <div>
        <asp:GridView ID="GridView2" runat="server" onprerender="GridView2_PreRender">
            <Columns>
                <asp:TemplateField HeaderText="Id">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Id") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Name">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
       
        </asp:GridView>
       
        <asp:DataPager ID="DataPager1" PagedControlID="GridView2" PageSize="15" runat="server">
                <Fields>
                    <asp:NextPreviousPagerField FirstPageText="首页" ShowPreviousPageButton="true" ShowLastPageButton="false"
                        ShowNextPageButton="false" ShowFirstPageButton="true" />
                    <asp:NumericPagerField />
                    <asp:TemplatePagerField>
                    </asp:TemplatePagerField>
                    <asp:NextPreviousPagerField LastPageText="末页" ShowFirstPageButton="false" ShowNextPageButton="true"
                        ShowPreviousPageButton="false" ShowLastPageButton="true" />
                </Fields>
            </asp:DataPager>
    </div>
    </form>
</body>

 

 

二,后台的,定义一个全局变量bFlag,添加一个按钮触发事件Button1_Click和另外写一个bindSelect() 方法。代码如下:

public partial class _Default : System.Web.UI.Page
{
    int bFlag = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bind();
           
        }
    }
    public void bind() {
        GridView2.DataSource = UserInfoService.GetUserInfo();
        GridView2.DataBind();
    }
    protected void GridView2_PreRender(object sender, EventArgs e)
    {
        if (bFlag == 1)
            bindSelect();
        else
            bind();
    }
    public void bindSelect() {

        GridView2.DataSource = UserInfoService.GetUserInfoBySelect(txtName.Text);
        GridView2.DataBind();
    
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        bFlag = 1;
        bindSelect(); //点击事件里面调用查询数据库的
    }
}

 


 

原创粉丝点击