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的所有记录都放在这个用户自定义控件当中。
我实现的效果:(数据库也贴出来大家看下)






