首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

4.4  查询结果显示方案

4.4.1  表格显示方式

在对数据进行查询后,还需要将查询结果显示在页面中反馈给浏览者。查询结果的显示方式有很多种,最常用的就是表格显示方式了。下面进行详细介绍。

1.方案分析

使用表格显示查询结果应用比较广泛,因为采用这种方式显示数据条理清晰、简捷明了,该方法适用于查询结果中字段数比较少,并且不带有图片字段的情况。例如,显示客户信息列表、供应商列表、员工工资列表和话费列表等。

2.实施过程

* 实例位置:光盘\mr\04\4.4\4.4.1\01

列表显示方式是将数据中的概要信息以表格的形式显示在主页面,例如在开发“销售管理系统后台管理”时,单击“商品销售查询”,进入商品销售查询界面。当用户设置好各项查询条件进行查询,数据将通过数据表格控件GridView显现出来,如图4.38所示。

图4.38 列表显示方式

程序实现具体步骤:

(1)新建一个网站命名为01,默认主页为Default.aspx。

(2)在该网站中新建一个名为Sell的文件夹,在此文件夹中添加一个名为Sell_search.aspx的页,并且在该页上添加5个TextBox控件,分别用于输入查询的关键字以及查询的起止日期。再添加4个CheckBox控件用于设置查询条件的数量。添加二个Button控件,分别用于执行查询操作和返回。添加一个GridView控件用于显示查询结果。

(3)程序主要代码如下

首先在Web.config文件中进行数据库连接配置,具体代码如下所示。

  <appSettings>

    <add key="strcon" value="server=.;database=db_04;uid=sa;pwd=;"></add>

  </appSettings>

列表显示方式适合于只显示数据的概要信息,例如在本例中利用列表方式将查询得到的数据的概要信息显示出来,并且在每个概要信息的后面都有“详细信息”的链接,单击“详细信息”会出现相关信息的详细说明。在“查询”按钮中运行如下代码,首先判断4个复选框控件是否被选中,如果被选中则运行相应的代码,最后通过一个自定义的bind方法来绑定查询得到的数据,并显示出来,具体的代码如下。

    protected void Button1_Click(object sender, EventArgs e)

    {

        string Sql=" ";

        if (CheckBox1.Checked)

        {

            Sql =Sql+"and CompanyName like '%"+TN.Text+"%' ";

        }

        if (CheckBox2.Checked)

        {

            Sql = Sql + "and CommodityName like '%"+PN.Text+"%' ";

        }

        if (CheckBox3.Checked)

        {

            Sql = Sql + "and kehu like '%"+MM.Text+"%' ";

        }

        if(CheckBox4.Checked)

        {

            Sql = Sql + "and StockDate between '"+SD.Text+"' and '"+ED.Text+"'";

        }

        Session["sql"] = Sql;

        this.bind();

    }

自定义的bind方法用来查询数据,并将数据绑定到数据控件GridView上,具体代码如下。

    public void bind()

    {

        string strsql,type;

        if (Request["type"] =="se")

        {

            type = "销售信息";

        }

        else

        {

            type = "销售退货";

        }

        Label1.Text = type;

        strsql = "select * from sell where type='" + type + "' "+Session["sql"]+" order by id desc";

        SqlConnection strcon = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["strcon"]);

        strcon.Open();

        SqlDataAdapter sda = new SqlDataAdapter(strsql, strcon);

        DataSet ds = new DataSet();

        sda.Fill(ds, "search");

        GridView1.DataSource = ds.Tables["search"];

        GridView1.DataKeyNames = new string[] { "id" };

        GridView1.DataBind();

    }

当单击每条信息后面的“详细信息”时,会弹出一个小窗口,显示详细信息,如图4.39所示。

图4.39  每条数据的详细信息

首先Sell_search.aspx页中的Gridview控件的RowEditing事件中添加如下代码,用于当单击“详细信息”后会将此条纪录的编号传递到Sell_open.aspx页中,在Sell_open.aspx页中根据传递过来的编号对数据库进行查询,并且以小窗口样式显示此条纪录的详细信息。

    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)

    {

        string id = GridView1.DataKeys[e.NewEditIndex].Value.ToString();

        Response.Write("<script>window.open('Sell_open.aspx?id=" + id + "','','width=450,height=450')</script>");

        Response.Write("<script>location='javascript:history.go(-1)'</script>");

    }

在Sell_open.aspx页中,首先接收传递过来的编号,然后通过编号对数据库进行查询,将查询结果分别绑定到相应的控件上,具体代码如下。

   protected void Page_Load(object sender, EventArgs e)

    {

        if(!IsPostBack)

        {

            string id = Request["id"];

            SqlConnection strcon = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["strcon"]);

            strcon.Open();

            SqlDataAdapter sda = new SqlDataAdapter("select * from sell where id="+Request["id"],strcon);

            DataSet ds = new DataSet();

            sda.Fill(ds, "sell");

            DataRowView rowview = ds.Tables["sell"].DefaultView[0];

            this.CommodityName.Text = rowview["CommodityName"].ToString();

            this.CompanyName.Text = rowview["CompanyName"].ToString();

            this.kehu.Text = rowview["kehu"].ToString();

            this.Type.Text = rowview["Type"].ToString();

            this.Number.Text = rowview["Number"].ToString();

            this.Pirce.Text = rowview["Pirce"].ToString();

            this.StockDate.Text =Convert.ToDateTime(rowview["StockDate"]).ToShortDateString();

            this.ManageMan.Text = rowview["ManageMan"].ToString();

            this.SettlementType.Text = rowview["SettlementType"].ToString();

            this.Username.Text = rowview["Username"].ToString();

            this.AddTime.Text = rowview["AddTime"].ToString();

            this.tol.Text = Convert.ToString(Convert.ToInt32(rowview["Pirce"]) * Convert.ToInt32(rowview["Number"]));

          

            string year = Convert.ToDateTime(rowview["StockDate"]).Year.ToString();

            string month = Convert.ToDateTime(rowview["StockDate"]).Month.ToString();

            if (month.Length < 2)

            {

                month = "0" + month;

            }

            string day = Convert.ToDateTime(rowview["StockDate"]).Day.ToString();

            if (day.Length < 2)

            {

                day = "0" + day;

            }

            string zero = "";

            for (int i = 1; i < (10 - id.Length); i++)

            {

                zero = zero + "0";

            }

            id = zero + id;

            this.uid.Text = year + month + day + id;

        }

    }

3.补充说明

在应用表格显示数据时,有时每个单元格的数据也许会超出单元格的宽度,这个时候数据就会打破单元格的布局,使整体的布局显得非常地协调,为了解决这个问题,可以对单元格中的数据长度进行控制,如果数据的长度超出了单元格的长度范围,就可以将数据截取一段然后加上“…”。这样就使整体的布局不被破坏。

例如:在本例中通过下面的代码实现这一功能。

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

    {

        if (e.Row.RowType == DataControlRowType.DataRow)

        {

            e.Row.Cells[4].Text = (Convert.ToDateTime(e.Row.Cells[4].Text)).ToShortDateString();

            if((e.Row.Cells[1].Text).Length>6)

            {

                e.Row.Cells[1].Text = (e.Row.Cells[1].Text).Substring(0,6)+"…";

            }

            if ((e.Row.Cells[0].Text).Length > 6)

            {

                e.Row.Cells[0].Text = (e.Row.Cells[0].Text).Substring(0, 6) + "…";

            }

            if ((e.Row.Cells[2].Text).Length > 6)

            {

                e.Row.Cells[2].Text = (e.Row.Cells[2].Text).Substring(0, 6) + "…";

            }

        }

    }

4.4.2  主细节页显示方式

通常情况下,在页面中显示包含字段比较多的数据时,可以通过主细节页面显示,即将要显示数据的概要信息显示在主页面中,并提供连接到显示详细信息的细节页面的超链接,这样不但可以简化页面、提高页面的下载速度,而且可以方便浏览者快速找到所需信息,节约时间。下面进行详细介绍。

1.方案分析

主细节页显示方式主要应用在数据表中的字段较多,多条数据放在同一页面显示不方便用户浏览的情况。在应用主细节页显示搜索结果时,需要分以下两个步骤实现。

(1)制作显示概要信息的主页面。首先需要查询出数据表中的概要信息,然后将查询出的概要信息显示在主页面中,最后设置打开细节页面的超链接。

(2)制作显示详细信息的细节页面。首先需接收从主页面传递的ID号,然后根据该ID号查询出详细信息,最后输出到细节页面中。

为了使读者更好的理解主细节页显示方式的实现,下面给出主细节页显示方式的流程,如图4.40所示。

图4.40  主细节页显示方式的流程图

2.实施过程

 实例位置:光盘\mr\04\4.4\4.4.2\01

在开发明日在线产品展示平台的时候,全部产品列表及其详细信息就应用了主细节页显示的方式,运行效果如图4.41和图4.42所示。

图4.42  显示所有的产品

当单击“笔记本“之后,页面会跳转到kshowpro.aspx页,用于显示笔记本的详细信息,如图4.43所示。

图4.42  某个产品的详细信息

程序实现具体步骤:

(1)新建一个网站命名为01,默认主页为Default.aspx。

(2)在页面中添加一个DataList控件,用于显示所有的产品。

(3)新建一个名为kshowpro.aspx的页,在页面上添加一个GridView控件,用于显示产品的详细信息。

(4)程序主要代码如下。

首先在Web.config文件中进行数据库连接配置,具体代码如下。

   <appSettings>

       <add key="ConnectionString" value="server=.;database=db_04;uid=sa;pwd="/>

   </appSettings>

创建一个名为center.cs的类,用于执行对数据库的各种操作,具体代码如下。

              public string ConnectionStrings=ConfigurationSettings.AppSettings["ConnectionString"];

      //读写数据表--DataTable

       public DataTable ReadTable(string strSql)

       {

              DataTable dd=new DataTable();//创建一个数据表dd

              SqlConnection dbconn=new SqlConnection(ConnectionStrings);//定义新的数据连接控件并初始化

              dbconn.Open();//打开连接

              SqlDataAdapter adapter = new SqlDataAdapter(strSql, dbconn);//定义并初始化数据适配器

              adapter.Fill(dd); //将数据适配器中的数据填充到数据集dd中

              dbconn.Close();//关闭连接

              return dd;

       }

       //读写数据集--DataSet

       public DataSet Readdate(string strSql)

       {

              DataSet dd=new DataSet();//创建一个数据集dd

            SqlConnection dbconn = new SqlConnection(ConnectionStrings);//定义新的数据连接控件并初始化

              dbconn.Open();//打开连接

              SqlDataAdapter adapter = new SqlDataAdapter(strSql, dbconn);//定义并初始化数据适配器

              adapter.Fill(dd); //将数据适配器中的数据填充到数据集dd中

              dbconn.Close();//关闭连接

              return dd;

       }

       public DataSet GetDataSet(string strSql,string tableName)

       {

          DataSet dataSet=new DataSet(); //定义一个数据集,用来赋值给应用程序的一个数据集

            SqlConnection conn = new SqlConnection(ConnectionStrings);//定义新的数据连接控件并初始化

              SqlDataAdapter dataAdapter=new SqlDataAdapter(strSql,conn);

              dataAdapter.Fill(dataSet,tableName);

              return dataSet;   //返回这个数据集

       }

       public SqlDataReader readrow(string sql)

       {

            SqlConnection Con = new SqlConnection(ConnectionStrings);//定义新的数据连接控件并初始化

              SqlCommand objCommand =new SqlCommand(sql,Con);

              SqlDataReader objDataReader ;

              objCommand.Connection.Open();

              objDataReader = objCommand.ExecuteReader();  

              if(objDataReader.Read())

              {

                 objCommand.Dispose();

                 return objDataReader;

              }

              else

              {

                 objCommand.Dispose();

                 return null;

              }

       }

       //读某一行中某一字段的值

       public string Readstr(string strSql,int flag)

       {

              DataSet dd=new DataSet();//创建一个数据集dd

              string str;

            SqlConnection dbconn = new SqlConnection(ConnectionStrings);//定义新的数据连接控件并初始化

              dbconn.Open();//打开连接

              SqlDataAdapter adapter = new SqlDataAdapter(strSql, dbconn);//定义并初始化数据适配器

              adapter.Fill(dd); //将数据适配器中的数据填充到数据集dd中

              str=dd.Tables[0].Rows[0].ItemArray[flag].ToString();

              dbconn.Close();//关闭连接

              return str;

       }

       public void execsql(string strSql)

       {

            SqlConnection dbconn = new SqlConnection(ConnectionStrings);//定义新的数据连接控件并初始化

              SqlCommand comm=new SqlCommand(strSql,dbconn);//定义并初始化命令对象

              dbconn.Close();//关闭连接

              dbconn.Open();//打开连接

              comm.ExecuteNonQuery();//执行命令

              dbconn.Close();//关闭连接

       }

在Default.aspx页中首先添加一个DataList控件,然后在此控件中新建一个模板列用于显示所有的商品信息,如图4.43所示。

图4.43  在DataList控件中添加一个模板列

DataList控件中模板列的代码如下。

<asp:datalist id="DataList1" runat="server" Width="532px" RepeatColumns="2" RepeatDirection="Horizontal">

<ItemTemplate>

<table width="99%" border="0" cellspacing="0" cellpadding="0">

<tr>

<td width="110" rowspan="2" align="center" valign="middle"><a href='kshowpro.aspx?proid=<%# DataBinder.Eval(Container.DataItem, "ST_ID")%> '><img src='productpic/<%# DataBinder.Eval(Container.DataItem, "ST_productpic")%>' width="100" height="60" border="0" /></a></td>

<td height="15" valign="top"><img src="images/dot_1.gif" width="15" height="15" /><a href='kshowpro.aspx?proid=<%# DataBinder.Eval(Container.DataItem, "ST_ID")%> '><strong><%# DataBinder.Eval(Container.DataItem, "ST_productname")%></strong></a></td>

</tr>

<tr>

<td><img src="images/dot_1.gif" width="24" height="11" />价格: ¥<%# DataBinder.Eval(Container.DataItem, "ST_Productprice")%>

元<br />

<img src="images/dot_1.gif" width="24" height="11" />分类:

<%# DataBinder.Eval(Container.DataItem, "ST_productclass")%>

</td>

</tr>

</table>

</ItemTemplate>

</asp:datalist>

然后在Default.aspx.cs中添加代码,用于将数据绑定到DataList控件上,具体代码如下。

    center database = new center();

    protected void Page_Load(object sender, System.EventArgs e)

    {

        // 在此处放置用户代码以初始化页面

        string strsql;

        if (Request.Params["skey"] == null)

        {

            if (Request.Params["proclassid"] != null)

            {

                string cproid = Request.Params["proclassid"].ToString();

                strsql = "select top 10 * from ST_tProduct where ST_productclass='" + cproid + "' order by ST_ID desc";

                DataTable dt = new DataTable();

                dt = database.ReadTable(strsql);

                DataList1.DataSource = dt;

                DataList1.DataBind();

            }

            else

            {

                strsql = "select * from ST_tProduct order by ST_ID desc";

                DataTable dt = new DataTable();

                dt = database.ReadTable(strsql);

                DataList1.DataSource = dt;

                DataList1.DataBind();

            }

        }

        else

        {

            strsql = "select top 10 * from ST_tProduct where ST_productname  like '%" + Request.Params["skey"].ToString() + "%' order by ST_ID desc";

            Response.Write(strsql);

            DataTable dt = new DataTable();

            dt = database.ReadTable(strsql);

            DataList1.DataSource = dt;

            DataList1.DataBind();

        }

    }

当单击任意一个商品时,页面会根据商品的ID值,跳转到商品的详细信息页面kshowpro.aspx,在此页面中,首先添加一个GridView控件,然后在此控件中添加一个模板列用于显示单个商品的详细信息,如图4.44所示。

图4.44  在GridView控件中添加一个模板列

GridView控件中模板列的代码如下。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">

 <Columns>

 <asp:TemplateField>

 <ItemTemplate>

<table width="530" border="0" align="center" cellpadding="5" cellspacing="1"><tr>

<td colspan="2" align="center"><%# DataBinder.Eval(Container.DataItem, "ST_productname")%></td>

</tr><tr>

<td colspan="2" align="center"><img src='productpic/<%# DataBinder.Eval(Container.DataItem, "ST_productpic")%>' width="400" height="300" /></td>

</tr><tr>

<td colspan="2">设计说明:<br />

<%# DataBinder.Eval(Container.DataItem, "ST_productinfo")%></td></tr><tr>

<td style="height: 25px">设计价格:<%# DataBinder.Eval(Container.DataItem, "ST_Productprice")%></td>

<td style="width: 274px; height: 25px">加入购物车&gt;&gt;</td></tr>

</table>

</ItemTemplate>

</asp:TemplateField>

</Columns>

 </asp:GridView>

在kshowpro.aspx.cs中会根据传递过来的ID值在数据库中进行查询,之后将查询到的信息绑定到GridView控件上显示出来,具体代码如下。

   center database = new center();

    protected void Page_Load(object sender, System.EventArgs e)

    {

        // 在此处放置用户代码以初始化页面

        string cproid = Request.Params["proid"].ToString();

        string strsql = "select * from ST_tProduct where ST_ID=" + cproid + " order by ST_ID desc";

        DataTable dt = new DataTable();

        dt = database.ReadTable(strsql);

        this.GridView1.DataSource = dt;

        this.GridView1.DataBind();

    }

3.补充说明

在实现通过主细节页显示数据时,提供连接到细节页的超链接可以通过多种方法设置。在本节的实施过程中介绍了如何通过表单元素的按钮设置超链接,下面介绍另外两种常用的设置方法。

l          在图片上设置

在图片上设置连接到细节页的超链接的代码如下:

<a href='kshowpro.aspx?proid=<%# DataBinder.Eval(Container.DataItem, "ST_ID")%> '><img src='productpic/<%# DataBinder.Eval(Container.DataItem, "ST_productpic")%>' width="100" height="60" border="0" /></a>

    说明:在为图片设置超链接时,将图片(<img>标记)的border属性设置为0,可以去除设置超链接后图片四周的蓝色边框。

l          在文字上设置

在文字上设置连接到细节页的超链接的代码如下:

<a href='kshowpro.aspx?proid=<%# DataBinder.Eval(Container.DataItem, "ST_ID")%> '><strong><%# DataBinder.Eval(Container.DataItem, "ST_productname")%></strong></a>

4.4.3  缩略图显示方式

缩略图显示方式也就是分栏显示方式,适用于数据中包括图片,并且图片能够清楚的表现整条数据的实际含义的情况。采用该方法可以很直观的找到所需信息。经常应用于展示企业信息和商品信息等。下面将详细介绍缩略图显示方式。

1.方案分析

在实现应用缩略图显示方式显示搜索结果时,需要判断查询结果是否为空,只有查询结果不为空时,才可以分栏显示搜索结果。在实现分栏显示时,根据保存查询结果的对象不同,使用的方法也不同。

2.实施过程

缩略图显示方式是将数据中的图片及标题分栏等简要信息显示在主页面中,例如在开发“电子商务”网站,就使用了缩微图的显示方式,如图4.45所示。当在页面左侧的搜索板块中选择类别为“电视区”,然后根据关键字“电视”进行查询,就会搜索出符合这两个查询条件的所有数据。如果数据带有相关的图片并且希望将搜索的数据直观的表现出来,那么就可以使用缩微图的方式来显示数据。

* 实例位置:光盘\mr\04\4.4\4.4.3\01

图4.45  缩微图的显示方式

程序实现具体步骤:

(1)新建一个网站命名为01,默认主页为Default.aspx。

(2)在页面中添加一个DataList控件,用于显示所有的产品。

(3)新建一个名为left.ascx的Web用户控件,在控件上添加一个DropDownList控件,用于设置查询的范围。添加一个TextBox控件,用于输入查询关键字。添加一个Button控件,用于提交查询。

(4)新建一个名为search.aspx的页,在此页上添加一个DataList控件,用于显示查询结果。

(5)程序主要代码如下。

首先在Web.config文件中进行数据库连接配置,具体代码如下。

   <appSettings>

      <add key="ccc" value="Server=.;User id=sa;pwd=;DataBase=db_04"></add>

   </appSettings>

   设置好各项查询条件之后,单击【搜索】按钮进行查询。其原理是先获得下拉列表和问本框中的值,然后将这两个值通过显性传参的方式传递到search.aspx中,具体代码如下。

 protected void Button3_Click(object sender, EventArgs e)

    {

        string str = DropDownList1.SelectedValue.ToString();

        string key = TextBox1.Text.Trim().ToString();

        Response.Redirect("search.aspx?stype="+str+"&key="+key);

    }

在search.aspx中首先判断传递过来的参数key是否为空,如果为空,说明文本框中没有输入任何关键字,则将和选择的类别相关的所有数据按照编号的降序排列显示出来。如果不为空,则将会根据传递过来的参数stype和参数key进行查询,然后将查询的数据显示出来。具体代码如下。

      SqlConnection strcon = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["ccc"]);

    protected void Page_Load(object sender, EventArgs e)

    {

        string newque;

        int stype = Convert.ToInt32(Request.QueryString["stype"]);

        string key = Request.QueryString["key"].ToString();

        if (key == "")

        {

            newque = "select * from tb_goods where typeid='" + stype + "' order by id desc";

        }

        else

        {

            newque = "select * from tb_goods where typeid='" + stype + "' and goodsname like '%" + key + "%'";

        }

        DataList1.DataSource = DataBase.ReDataSet(newque);

        DataList1.DataKeyField = "id";

        DataList1.DataBind();

        string supertype = "select * from tb_supertype";

        string subtype = "select * from tb_subtype";

        DataSet dssuper = DataBase.ReDataSet(supertype);

        DataSet dssub = DataBase.ReDataSet(subtype);

        DataRow[] rows = dssuper.Tables[0].Select();

        DataRow[] subrows = dssub.Tables[0].Select();

        if (!IsPostBack)

        {

            foreach (DataRow row in rows)

            {

                TreeNode nd = new TreeNode();

                nd.Text = row["typename"].ToString();

                nd.Value = row["id"].ToString();

                TreeView1.Nodes.Add(nd);

                foreach (DataRow subrow in subrows)

                {

                    TreeNode subnd = new TreeNode();

                    subnd.Text = subrow["typename"].ToString();

                    subnd.Value = subrow["id"].ToString();

                    if (subrow["supertype"].ToString() == row["id"].ToString())

                    {

                        nd.ChildNodes.Add(subnd);

                    }

                }

            }

        }

    }

3.补充说明

缩略图显示方式适用于数据中包括图片并且图片能够清楚的表现整条数据的实际含义的情况。采用该方法可以很直观地找到所需信息。

4.4.4  分页显示方式

本节介绍的分页显示是指查询结果分页显示。当用户从数据库中查询出的记录较多时,如果用一个页面来显示所有的记录,不仅运行速度较慢,也会给用户浏览带来诸多不便。这时就可以通过对查询结果进行分页显示来解决这一问题。

1.方案分析

如果某个页面中加载的数据过多,打开的速度就会很慢。所以通常如果搜索的数据过多的时候,都会将其分页显示,同时也方便了浏览者查找数据,分页的方法有很多种:

① GridView控件+ PageIndexChanged事件

GridView控件有个PageIndexChanged事件,在页面代码中增加处理PageIndexChanged事件的方法,然后根据GridView控件的PageIndex,PageSize属性调用相应的分页方法然后绑定数据。

② Repeater + URL字符串参数

GridView控件是固定了的格式显示数据,Repeater控件是一个数据显示控件,该控件允许通过为列表中显示的每一项重复使用指定的模板来自定义布局。但是Repeater控件没有内建的分页功能。没有内建的分页功能,就要辅助实现它,常见的解决方案有,用URL字符串参数传递信息,然后在服务端数据传递过来的信息,然后进行数据绑定。

③ 数据控件 + AspNetPager分页控件

分页原理基本上一样,而且UI元素也差不多,无非就是前一页,后一页,第一页,最后一页,还有中间的几页,我们可以把这些都抽象出来,然后写一个自定义控件,即分页控件,分页控件定义一些属性和事件,在要用到分页的页面直接调用这个控件就可以了,根据分页控件所发生的事件调用业务层数据并绑定数据控件。

2.实施过程

数据分页就是将庞大的数据分割成若干个小块显示出来,通常是利用数据控件来显示数据的当搜索的数据非常庞大的时候,就需要对查询的数据进行分页。如果不对数据进行分页,不但浏览起来非常的烦琐,而且对程序运行的速度也有相当大的影响。下面就根据“网络考试后台管理”中对“管理课程信息”进行查询为例来讲解数据分页的实现过程。单击左侧的“管理课程信息”,出现如图4.46所示的页面,在下拉列表中选择查询数据所属的类别,然后在文本框中输入关键字,单击“查询”进行查询。

* 实例位置:光盘\mr\04\4.4\4.4.4\01

图4.46  对查询数据进行分页显示

程序实现具体步骤:

(1)新建一个网站命名为01,默认主页为Default.aspx。

(2)新建一个名为HouAdmin的文件夹,在此文件夹中添加一个名为kecheng_xinxi.aspx的页,在该页上添加一个DropDownList控件,用于选择查询条件,再添加一个TextBox控件,用于输入查询的关键字。添加一个Button控件,用于提交查询。添加一个GridView控件,用于显示查询数据。

(3)程序主要代码如下。

首先在Web.config文件中进行数据库连接配置,具体代码如下。

   <appSettings>

       <add key="db_ExaminationConnectionString" value="Server=(local);User id=sa;PWD=;Database=db_04"/>

   </appSettings>

本例中用到的视图kecheng_zhuanye_view,用于查询表tb_Lesson和表tb_Profession的所有数据,具体代码如下。

CREATE VIEW kecheng_zhuanye_view

AS

SELECT dbo.tb_Lesson.Name, dbo.tb_Profession.Name AS Expr1,

      dbo.tb_Lesson.JoinTime, dbo.tb_Lesson.ID

FROM dbo.tb_Lesson INNER JOIN

      dbo.tb_Profession ON dbo.tb_Lesson.ofProfession = dbo.tb_Profession.ID

登录成功进入主界面之后,单击左侧菜单中的“管理课程信息”,进入课程信息的管理界面当设置完查询条件及关键字之后,单击“查询”按钮进行查询,将会运行如下代码。如果文本框中没有输入关键字,那么系统将会返回数据库中所有的课程信息。否则将根据设置的查询条件进行查询然后显示出来,具体代码如下。

    protected void Button1_Click(object sender, EventArgs e)

    {

        if (txtSelect.Text == "")

        {

            dataconn.ecadabindinfostring(gvLessInfo, "Select * From kecheng_zhuanye_view ORDER BY ID DESC", "ID");

        }

        else

        {

            dataconn.ecadabind(gvLessInfo, "Select * From kecheng_zhuanye_view Where "

                + ddlLessName.SelectedValue + " Like '%" + txtSelect.Text + "%'");

        }

    }

上面的程序用到了dataconn类中的ecadabind方法和ecadabindinfostring方法,下面对这两种方法进行说明。

当文本框中输入了查询的关键字,则运行ecadabind方法进行查询,并且将查询的数据绑定到GridView控件上,具体代码如下。

  public bool ecadabind(GridView gv, string sqlstr4)

    {

        SqlConnection con = this.getcon();

        con.Open();

        SqlDataAdapter mydataadapter = new SqlDataAdapter(sqlstr4, con);

        DataSet mydataset = new DataSet();

        mydataadapter.Fill(mydataset);

        gv.DataSource = mydataset;

        try

        {

            gv.DataBind();

            return true;

        }

        catch

        {

            return false;

        }

        finally

        {

            con.Close();

        }

    }

当文本框中没有输入任何的关键字时,运行ecadabindinfostring方法,此方法将会把所有的数据按照指定的查询语句显示出来,例如本例中将所有的课程信息按照编号进行降序排列并显示出来,具体代码如下。

    public bool ecadabindinfostring(GridView gv, string sqlstr5,string DNK)

    {

        SqlConnection con = this.getcon();

        con.Open();

        SqlDataAdapter mydataadapter = new SqlDataAdapter(sqlstr5, con);

        DataSet mydataset = new DataSet();

        mydataadapter.Fill(mydataset);

        gv.DataSource = mydataset;

        gv.DataKeyNames=new string[]{DNK};

        try

        {

            gv.DataBind();

            return true;

        }

        catch

        {

            return false;

        }

        finally

        {

            con.Close();

        }

    }

3.补充说明

对于数据的分页显示,不仅可以通过数据控件自带的功能进行分页(例如Gridview控件)还可以对Repeater控件、Gridview控件以及DataList控件进行自定义分页。虽然个别数据控件自带了数据分页的功能,减少了程序员编写代码的数量使数据分页变得简单易行,但是其分页样式单一,而且灵活性差也成为了其不可避免的缺点。为了追求样式的完美和性能的提高,程序员们更热衷于自定义分页,下面就以对DataList控件进行自定义分页为例,讲解自定义分页的相关知识,对于Repeater控件和Gridview控件的自定义分页与DataList控件的自定义分页方法基本相同。

在开发论坛网站时,常常需要在页面中比较全面显示一些信息,但如果要显示的信息记录较多,此时用一个页面显示所有记录,可能给用户的浏览带来很大不便。为了解决这个问题,开发人员可以使用分页技术来限定一个页面中显示的记录数。在论坛系统中,通过在DataList控件中绑定数据,分页显示该论坛系统中的帖子信息。运行结果如图4.47所示。

图4.47  DataList数据绑定并分页

DataList有关的属性及说明如下所示。

① DataKeyField属性:获取或设置由DataSource属性指定的数据源中的键字段。

② DataKeys属性:获取存储数据列表控件中每个记录的键值。

③ DataMember属性:获取或设置多成员数据源中要绑定到数据列表控件的特定数据成员。

④ DataSource属性:获取或设置数据源,该数据源中包含用于填充控件中的项的值列表。

DataList控件的分页实现是借助PagedDataSource类实现的,该类封装了数据控件的分页属性,其常用属性及说明如表4.6所示。

表4.6                                             属性说明

属性

说明

AllowPaging

获取或设置是否启用分页

AllowCustomPaging

获取或设置是否启用自定义分页

CurrentPageIndex

获取或设置当前显示页的索引

DataSource

获取或设置用于填充控件中项的源数据

PageSize

获取或设置要在数据绑定控件的每页上显示的项数

PageCount

获取显示数据绑定控件中各项所需的总页数

FirstIndexPage

获取页中的第一个索引

IsFirstPage

获取一个值,该值指示当前页是否是首页

IsLastPage

获取一个值,该值指示当前页是否是最后一页

在网站首页的Page_Load事件中,调用用户自定义的dlBind方法对DataList控件进行数据绑定并分页。Page_Load事件代码如下。

protected void Page_Load(object sender, EventArgs e)

    {

        dlBind();

    }

该页的Page_Load事件中调用了自定义方法dlBind。dlBind方法为自定义的无返回值类型方法,该方法主要用来从数据库中查询出符合指定条件的记录,并绑定到DataList控件中,然后通过设置PagedDataSource类对象的AllowPaging属性为True,来实现DataList控件的分页功能。dlBind方法关键代码如下。

public void dlBind()

    {

        int curpage = Convert.ToInt32(this.labPage.Text);

        PagedDataSource ps = new PagedDataSource();

        sqlcon = new SqlConnection(strCon);

        sqlcon.Open();

        string sqlstr = "select a.*,b.* from tb_Card as a join tb_Module as b on a.ModuleID=b.ModuleID";

        SqlDataAdapter MyAdapter = new SqlDataAdapter(sqlstr, sqlcon);

        DataSet ds = new DataSet();

        MyAdapter.Fill(ds, "tb_Card");

        ps.DataSource = ds.Tables["tb_Card"].DefaultView;

        ps.AllowPaging = true; //是否可以分页

        ps.PageSize = 2; //显示的数量

        ps.CurrentPageIndex = curpage - 1; //取得当前页的页码

        this.lnkbtnUp.Enabled = true;

        this.lnkbtnNext.Enabled = true;

        this.lnkbtnBack.Enabled = true;

        this.lnkbtnOne.Enabled = true;

        if (curpage == 1)

        {

            this.lnkbtnOne.Enabled = false;//不显示第一页按钮

            this.lnkbtnUp.Enabled = false;//不显示上一页按钮

        }

        if (curpage == ps.PageCount)

        {

            this.lnkbtnNext.Enabled = false;//不显示下一页

            this.lnkbtnBack.Enabled = false;//不显示最后一页

        }

        this.labBackPage.Text = Convert.ToString(ps.PageCount);

        this.dlContent.DataSource = ps;

        this.dlContent.DataKeyField = "CardID";

        this.dlContent.DataBind();

        sqlcon.Close();

    }

通过4个LinkButton控件来控制数据分页的,当用户单击用于操作分页的LinkButton控件时,程序根据当前页码执行指定操作。LinkButton控件的Click事件代码如下。

protected void lnkbtnOne_Click(object sender, EventArgs e)

    {

        this.labPage.Text = "1";

        this.dlBind();

    }

    protected void lnkbtnUp_Click(object sender, EventArgs e)

    {

        this.labPage.Text = Convert.ToString(Convert.ToInt32(this.labPage.Text) - 1);

        this.dlBind();

    }

    protected void lnkbtnNext_Click(object sender, EventArgs e)

    {

        this.labPage.Text = Convert.ToString(Convert.ToInt32(this.labPage.Text) + 1);

        this.dlBind();

    }

    protected void lnkbtnBack_Click(object sender, EventArgs e)

    {

        this.labPage.Text = this.labBackPage.Text;

        this.dlBind();

    }

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论