十天学会ASP.Net——(7)
7.数据库查询——新闻管理系统的用户界面
首先是一个简单的现实界面,要求传递CateID作为URL中Get的参数,用来显示Cate表一条内容:
string id = Request.QueryString["ID"]; string conString2 = "Data Source= 192.168.43.1;Initial Catalog= dotnet;User ID= dotnet;Password=dotnet"; SqlConnection myConnection = new SqlConnection(conString2); string cmdText = "select * from [VNews] where ID='" + id +"'"; SqlCommand myCommand = new SqlCommand(cmdText, myConnection); myConnection.Open(); SqlDataReader dr = myCommand.ExecuteReader(); if (dr.Read()) { lblTitle.Text = dr["Title"].ToString(); lblContent.Text = dr["Contents"].ToString(); } myConnection.Close();
以上是刚刚提到过的SqlDataReader读取数据那么用GridView对象显示数据呢?
GridView1.DataSource = dr;
GridView1.DataBind();
这里就直接把获得的SqlDataReader作为了GridView对象的数据源,然后让GridView自己绑定数据源就搞定了。
实际上,System.Data中提供的可以作为数据源的对象很多。比如DataSet对象DataTable对象,DataAdapter对象作为DataSet对象的中间件,跟数据库打交道的DataSource对象。
总结一下:
DataSet就是数据库可以有多张表
DataTable数据库的表
DataReader游标,可以反复读数据(单向操作)
DataAdapter适配器(双向操作)
例1:
SqlDataAdapter da = new SqlDataAdapter(cmdText, myConnection); DataSet ds = new DataSet(); da.Fill(ds); GridView1.DataSource = ds.Tables[0].DefaultView; GridView1.DataBind();
例2:
SqlDataReader dr = myCommand.ExecuteReader(); ds.Load(dr, LoadOption.Upsert, "cate"); GridView1.DataSource = ds; GridView1.DataBind();
使用Repeater自己定制格式加载数据
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<li><span class="time"><%#Eval("PostDate") %></span>
<a href='show_news.aspx?id=<%#Eval("ID") %>' target="_blank">
<%#Eval("title") %>
</a></li>
</ItemTemplate>
</asp:Repeater>
这样,后台只要Bind一条记录前台就可以以自定义的格式显示该条记录,或者在页面上多设一些Repeator,或者运用动态添加的技术,然后可以充分发挥Repeater的定制性能,数据有多少就会出现多少行了。
现在再让我们来看看学校的新闻网:
我们现在来关心中间的豆腐块是怎么实现的:
其实就是刚刚用的Repeater对象,
新建一个Web用户自定义控件:
然后看看新闻网的实现呀:
是一个无序列表<ul>,中间的其中一块豆腐就是一个<li>再看下他放在哪里,这个是制作豆腐块的关键:
<div id="middlewrap-right">
<div id="bmcz_zonghexinwen">
<h1 class="title_zonghexinwen"><span class="more"><a href="/articles/75/">更多>></a></span></h1>
<ul>
<li class="first">
<span class="time">05-22</span>
<a href="/articles/75/18910/" target="_blank" title="文章标题:2012年“吾爱吾”心理健康宣传周开幕式暨专题培训讲座如期举行
作 者:谭娟晖
点 击 率:58" class="title-color0">
[<font color="blue">图</font>]2012年“吾爱吾”心理健康宣传周开幕式暨
</a></li>
一下还有几条内容,我们可以看到,这里并没有看到综合新闻的这几个字,它是一张Css控制的图片,其实让页面排布成这样方块形的也是CSS,所以我们要导入页面的Css文件:
顾构造WebUserControl.ascx页面代码如下
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %> <div id="middlewrap"> <div id="xueyuankuaixun"><h1 class="title_xueyuankuaixun"><span class="more"><a href="/articles/53/">更多>></a></span></h1> <div id="bmcz_zonghexinwen"> <h1 class="title_zonghexinwen"> <span class="more"><a href="http://news.zafu.edu.cn/articles/75/">更多>></a></span> </h1> <asp:Label ID="lblTitle" runat="server" Text=""></asp:Label> <ul> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <li><span class="time"> <%#Eval("PostDate") %></span> <a href="show_news.aspx?id=<%#Eval("ID") %>" target="_blank" class="title-color0"> <%#Eval("Title") %></a></li> </ItemTemplate> </asp:Repeater> </ul> </div> </div>
后台代码:
//字段 private string cateID; //属性 public string CateID { get { return cateID; } set { cateID = value; } } protected void Page_Load(object sender, EventArgs e) { string id = cateID; if (string.IsNullOrEmpty(id)) { Response.Write("id是空"); return; } string conString2 = "Data Source= localhost;Initial Catalog= dotnet;User ID= sa;Password=000000"; SqlConnection myConnection = new SqlConnection(conString2); string cmdText = "select * from [News] where CateID='" + id + "'"; SqlCommand myCommand = new SqlCommand(cmdText, myConnection); myConnection.Open(); SqlDataReader dr = myCommand.ExecuteReader(); Repeater1.DataSource = dr; Repeater1.DataBind(); myConnection.Close(); //Label1.Text = "类别[" + TextBox1.Text + "]添加成功"; }
然后建立豆腐块.aspx
<%@ Page Title="" Language="C#" MasterPageFile="MasterPage.master" AutoEventWireup="true" CodeFile="豆腐块.aspx.cs" Inherits="豆腐块" %> <%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> <link href="http://news.zafu.edu.cn/static/front/default/css/base2.css" rel="stylesheet" type="text/css" media="screen" /> <script type="text/javascript" src="http://news.zafu.edu.cn/static/admin/js/jquery.min.js"></script> <link href="http://news.zafu.edu.cn/static/front/default/css/home2.css" rel="stylesheet" type="text/css" media="screen" /> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <uc1:WebUserControl ID="uc1" runat="server" CateID="1" /> <uc1:WebUserControl ID="WebUserControl1" runat="server" CateID="2"/> <uc1:WebUserControl ID="WebUserControl2" runat="server" CateID="3"/> </asp:Content>
注意代码行中的CateID="2"就代表传给WebUserControl.ascx一个实例的CateID属性赋值为"2",这样,在调用代码的时候就会执行"select * from [News] where CateID='" + id + "'",将查询出数据库中目录号为2的所有记录都放在这个用户自定义控件当中。
我实现的效果:(数据库也贴出来大家看下)