一、Repeater控件的简单示例
这种方式很简单,只需要拖控件,设置它的各项ItemTemplate,将SqlDataSource数据源中的数据手动代码绑定上去就可以了,当然了,这样比较丑,只能查看数据,而且不能做分页等操作。代码如下:
- <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
- <HeaderTemplate>
- <table border="1pt">
- <tr><td colspan="5">我是头模板</td></tr>
- </HeaderTemplate>
- <ItemTemplate>
- <tr>
- <td><a href="Repeater.aspx?id=<%# Eval("ID") %>"><%# Eval("ID") %></a></td>
- <td><%# Eval("sname") %></td>
- <td><%# Eval("english") %></td>
- <td><%# Eval("distrubute")%></td>
- <td><%# Eval("finalpoint") %></td>
- </tr>
- </ItemTemplate>
- <AlternatingItemTemplate>
- <tr>
- <td><font color="red"><%# Eval("ID") %></font></td>
- <td><font color="red"><%# Eval("sname") %></font></td>
- <td><font color="red"><%# Eval("english") %></font></td>
- <td><font color="red"><%# Eval("distrubute") %></font></td>
- <td><font color="red"><%# Eval("finalpoint") %></font></td>
- </tr>
- </AlternatingItemTemplate>
- <SeparatorTemplate>
- <tr><td colspan="5"><hr size="1pt" /></td></tr>
- </SeparatorTemplate>
- <FooterTemplate>
- </table>
- </FooterTemplate>
- </asp:Repeater>
- <asp:SqlDataSource ID="SqlDataSource1" runat="server"
- ConnectionString="<%$ ConnectionStrings:DbOneConnectionString %>"
- SelectCommand="SELECT [ID], [sname], [english], [distrubute], [finalpoint], [sbool] FROM [sscore_OLD_local]">
- </asp:SqlDataSource>
二、Reapter控件的嵌套和分页
嵌套的时候,当然只能手动写它的数据源代码,示例如下:
- <asp:Repeater ID="Repeater1" runat="server"
- onitemdatabound="Repeater1_ItemDataBound">
- <HeaderTemplate>
- <table border="1pt" width="500">
- <tr style="background-color:#ccffcc;"><td colspan="5">我是头模板</td></tr>
- </HeaderTemplate>
- <ItemTemplate>
- <tr>
- <td><a href="Repeater.aspx?id=<%# Eval("ID") %>"><%# Eval("ID") %></a></td>
- <td><%# Eval("sname") %></td>
- <td><%# Eval("english") %></td>
- <td><%# Eval("distrubute")%></td>
- <td>
- <asp:Repeater ID="Repeater2" runat="server" datasource='<%# Eval("myrela") %>'>
- <ItemTemplate>
- <%# Eval("[/"ID/"]") %><br />
- </ItemTemplate>
- </asp:Repeater>
- </td>
- </tr>
- </ItemTemplate>
- <AlternatingItemTemplate>
- <tr>
- <td><font color="red"><%# Eval("ID") %></font></td>
- <td><font color="red"><%# Eval("sname") %></font></td>
- <td><font color="red"><%# Eval("english") %></font></td>
- <td><font color="red"><%# Eval("distrubute") %></font></td>
- <td>
- <asp:Repeater ID="Repeater2" runat="server" datasource='<%# Eval("myrela") %>'>
- <ItemTemplate>
- <%# Eval("[/"sname/"]") %><br />
- </ItemTemplate>
- </asp:Repeater>
- </td>
- </tr>
- </AlternatingItemTemplate>
- <SeparatorTemplate>
- <tr><td colspan="5"><hr size="1pt" /></td></tr>
- </SeparatorTemplate>
- <FooterTemplate>
- <tr>
- <td colspan="5" style="font-size:12pt;color:#0099ff;background-color:#e6feda;">
- 共<asp:Label ID="lblp" runat="server" Text = "Lable"></asp:Label>页
- 当前<asp:Label ID="lblc" runat="server" Text = "Lable"></asp:Label>页
- <asp:HyperLink ID="hlfir" runat="server" Text="首页"></asp:HyperLink>
- <asp:HyperLink ID="hlp" runat="server" Text="上一页"></asp:HyperLink>
- <asp:HyperLink ID="hln" runat="server" Text="下一页"></asp:HyperLink>
- <asp:HyperLink ID="hlla" runat="server" Text="末页"></asp:HyperLink>
- </td>
- </tr>
- </table>
- </FooterTemplate>
- </asp:Repeater>
请注意在内嵌Reapter控件中的数据绑定方式,和开始略有不同。FooterTemplate模板的两个Lable和四个HyperLink是用来实现分页的,稍后详述。Reapter控件的数据代码绑定方式如下:
- protected void Page_Load(object sender, EventArgs e)
- {
- //Datalist数据源绑定
- if (!IsPostBack)
- {
- Repeater1.DataSource = pds();
- Repeater1.DataBind();
- }
- }
- private PagedDataSource pds()
- {
- string conn = ConfigurationManager.ConnectionStrings["DbOneConnectionString"].ConnectionString;
- //声明查询字符串
- SqlConnection con = new SqlConnection(conn);
- //初始化连接,实际就是打开或建立一个数据库连接,在此连接上可以进行查询
- DataSet ds = new DataSet();
- //创建DataSet,即是数据在内存中以DataTable为类型的缓存
- SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM SSCORE_OLD_local", con);
- //创建查询了
- sda.Fill(ds,"name");
- //将查询到的数据填充到name表中
- SqlDataAdapter sda2 = new SqlDataAdapter("SELECT * FROM SSCORE_OLD", con);
- sda2.Fill(ds, "title");
- ds.Relations.Add("myrela", ds.Tables["name"].Columns["sname"], ds.Tables["title"].Columns["sname"]);
- //为两个表创建关系,将名字相同的ID放一起
- PagedDataSource pds = new PagedDataSource();
- pds.DataSource = ds.Tables["name"].DefaultView;
- pds.AllowPaging = true;
- pds.PageSize = 6;
- pds.CurrentPageIndex = Convert.ToInt32(Request.QueryString["page"]);
- return pds;
- }
注意,其数据绑定只一次,所以使用了if (!IsPostBack)来判断,特别注意上述代码的28行,两个表格的数据相等,而且加到一个关系中,至于内嵌的Reapter控件的数据内容具体是什么,得看内嵌的Reapter控件绑定的是这个关系中的什么数据。
DataSet 类
DataSet 是 ADO.NET 结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。DataSet 由一组 DataTable 对象组成,您可使这些对象与 DataRelation 对象互相关联。您还可通过使用 UniqueConstraint 和 ForeignKeyConstraint 对象在 DataSet 中实施数据完整性。有关使用 DataSet 对象的详细信息,请参见 使用数据集 (ADO.NET) 。
尽管 DataTable 对象中包含数据,但是 DataRelationCollection 允许您遍览表的层次结构。这些表包含在通过 Tables 属性访问的 DataTableCollection 中。当访问 DataTable 对象时,请注意它们是按条件区分大小写的。例如,如果一个 DataTable 被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。有关使用 DataTable 对象的更多信息,请参见 创建数据表 (ADO.NET) 。
DataSet 可将数据和架构作为 XML 文档进行读写。数据和架构可通过 HTTP 传输,并在支持 XML 的任何平台上被任何应用程序使用。可使用 WriteXmlSchema 方法将架构保存为 XML 架构,并且可以使用 WriteXml 方法保存架构和数据。若要读取既包含架构也包含数据的 XML 文档,请使用 ReadXml 方法。
在典型的多层实现中,用于创建和刷新 DataSet 并依次更新原始数据的步骤包括:
1. 通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。
2. 通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。
3. 调用 GetChanges 方法以创建只反映对数据进行的更改的第二个 DataSet。
4. 调用 DataAdapter 的 Update 方法,并将第二个 DataSet 作为参数传递。
5. 调用 Merge 方法将第二个 DataSet 中的更改合并到第一个中。
6. 针对 DataSet 调用 AcceptChanges。或者,调用 RejectChanges 以取消更改。
SqlDataAdapter类
SqlDataAdapter 是 DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。更新是逐行进行的。对于每个已插入、修改和删除的行,Update 方法会确定已对其执行的更改的类型(Insert、Update 或 Delete)。根据更改类型,执行 Insert、Update 或 Delete 命令模板将已修改的行传播给数据源。当 SqlDataAdapter 填充 DataSet 时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。但是,除非 MissingSchemaAction 属性设置为 AddWithKey,否则这个隐式创建的架构中不包括主键信息。也可以使用 FillSchema,让 SqlDataAdapter 创建 DataSet 的架构,并在用数据填充它之前就将主键信息包括进去。有关更多信息,请参见 向数据集添加现有约束 (ADO.NET)。
SqlDataAdapter 与 SqlConnection 和 SqlCommand 一起使用,以便在连接到 SQL Server 数据库时提高性能。
注意: |
如果使用 SQL Server 存储过程编辑或删除使用 DataAdapter 的数据,请确保不要在存储过程定义中使用 SET NOCOUNT ON。这将导致返回的受影响行数为零,DataAdapter 将其解释为并发冲突。这种情况下将引发 DBConcurrencyException。 |
SqlDataAdapter 还包括 SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 和 TableMappings 属性,以便于数据的加载和更新。
当创建 SqlDataAdapter 的实例时,读/写属性将被设置为初始值。有关这些值的列表,请参见 SqlDataAdapter 构造函数。
InsertCommand、DeleteCommand 和 UpdateCommand 是泛型模板,通过参数机制由来自每个修改行的各个值自动填充。
对于传播给 Update 上的数据源的每一列,应向 InsertCommand、UpdateCommand 或 DeleteCommand 添加一个参数。DbParameter 对象的 SourceColumn 属性将被设置为列的名称。此设置指示该参数值并非手动设置,而是获取自当前处理的行中的特定列。
应用两个Lable和四个HyperLink和Reapter控件的ItemDataBound事件来实现分页,代码如下:
- protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
- {
- if (e.Item.ItemType == ListItemType.Footer)
- {
- int count = pds().PageCount;//(Repeater)object).Items.Count;
- int i = pds().CurrentPageIndex;//
- Label lblpc = (Label)e.Item.FindControl("lblp");
- lblpc.Text = count.ToString();
- Label lblct = (Label)e.Item.FindControl("lblc");
- lblct.Text = (i + 1).ToString();
- //首页
- HyperLink hlfir = (HyperLink)e.Item.FindControl("hlfir");
- if (i != 0)
- {
- hlfir.NavigateUrl = "RepeaterNesting.aspx?page=0";
- }
- else
- {
- hlfir.Enabled = false;
- }
- //上一页
- HyperLink hlp = (HyperLink)e.Item.FindControl("hlp");
- if (i > 0)// >= 1
- {
- hlp.NavigateUrl = "RepeaterNesting.aspx?page=" + (i - 1).ToString();
- }
- else
- {
- hlp.Enabled = false;
- }
- //下一页
- HyperLink hln = (HyperLink)e.Item.FindControl("hln");
- if (i < count - 1)
- {
- hln.NavigateUrl = "RepeaterNesting.aspx?page=" + (i + 1).ToString();
- }
- else
- {
- hln.Enabled = false;
- }
- //末页
- HyperLink hlla = (HyperLink)e.Item.FindControl("hlla");
- if(i == count - 1)
- {
- hlla.Enabled = false;
- }
- else
- {
- hlla.NavigateUrl = "RepeaterNesting.aspx?page=" + (count - 1).ToString();
- }
- }
- }
其它的,肯定还有多种分页方式,希望大师或高手能推荐更好的方式分享。