文章教程

10.3Repeater控件

8/31/2020 9:19:23 PM 人评论 次浏览

10.3 Repeater控件

Repeater控件是一个数据绑定控件,用于生成各个项的列表。使用模板来定义网页上的各个项的布局,当运行页面时,Repeater控件为数据源中的每个项重复此布局。一般情况下,将Repeater控件称为重复控件。

10.3.1 Repeater控件的模板

Repeater控件是容器控件,使用它可以从页的任何可用数据中创建出自定义列表。由于Repeater控件没有默认的外观,因此,可以使用Repeater控件创建多种列表,如表布局、逗号分隔列表和XML格式的列表等。

Repeater控件不具备内置的呈现功能,开发者必须通过创建模板为Repeater控件提供布局。模板可以包含标记和控件的任意组合,如果未定义模板,或者如果模板不包含元素,则当应用程序运行时,Repeater控件不显示在页面上。

Repeater控件支持5种模板,如表10-3所示。

表10-3 Repeater控件的5种模板

【范例6】

读取UserInfo表中的所有记录,这些记录包含UserName、UserPass、UserMail和UserBirth字段的值。实现步骤如下。

(1)从工具箱中拖动SqlDataSource控件到页面中,代码如下。

    <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:UserRegisterConnectionString %>" ID="SqlDataSource1" runat="server" SelectCommand="SELECT [UserName], [UserPass], [UserMail], [UserBirth] FROM [UserInfo]">
    </asp:SqlDataSource>

(2)从工具箱中拖动Repeater控件到页面中,代码如下。

    <asp:Repeater   ID="Repeater1"   runat="server"   DataSourceID="SqlData
    Source1">
    </asp:Repeater>

(3)为Repeater控件指定HeaderTemplate模板项,代码如下。

    <HeaderTemplate>
        <table>
          <tr>
              <th style="width:150px; ">用户名</th>
              <th style="width:150px; ">用户密码</th>
              <th style="width:250px; ">电子邮箱</th>
              <th style="width:200px; ">出生日期</th>
          </tr>
    </HeaderTemplate>

(4)为Repeater控件指定ItemTemplate模板项,在该项中指定每个单元格的背景颜色。代码如下。

    <ItemTemplate>
        <tr>
          <td style="background-color: #CCFFCC"><asp:Label runat="server" ID="lblName" Text='<%# Eval("UserName") %>' /></td>
          <td style="background-color: #CCFFCC"><asp:Label runat="server" ID="lblPass" Text='<%# Eval("UserPass") %>' /></td>
          <td style="background-color: #CCFFCC"><asp:Label runat="server" ID="lblMail" Text='<%# Eval("UserMail") %>' /></td>
          <td style="background-color: #CCFFCC"><asp:Label runat="server" ID="lblBirth" Text='<%# Eval("UserBirth", "{0:yyyy年MM月dd日}")
          %>' /></td>
        </tr>
    </ItemTemplate>

(5)为Repeater控件指定AlterItemTemplate模板项,这里不再指定单元格的背景颜色。代码如下。

    <AlternatingItemTemplate>
        <tr>
            <td><asp:Label runat="server" ID="lblName" Text='<%# Eval("User Name") %>' /></td>
            <td><asp:Label runat="server" ID="lblPass" Text='<%# Eval("User Pass") %>' /></td>
            <td><asp:Label runat="server" ID="lblMail" Text='<%# Eval("User Mail") %>' /></td>
            <td><asp:Label runat="server" ID="lblBirth" Text='<%# Eval("User Birth", "{0:yyyy年MM月dd日}") %>' /></td>
        </tr>
    </AlternatingItemTemplate>

(6)为Repeater控件指定FooterTemplate模板项,该模板项包含一个table元素的结束标记。

(7)运行页面查看效果,如图10-9所示。从该图中可以看出,为Repeater控件指定的ItemTemplate和AlterItemTemplate模板项起到了作用。

图10-9 Repeater控件的使用

10.3.2 Repeater控件的属性

Repeater控件提供了一系列的属性,如范例6为其指定的DataSourceID属性。除了这个属性外,Repeater控件还包含多个常用属性,如表10-4所示。

表10-4 Repeater控件的常用属性

在表10-4中,Items属性返回的是一个RepeaterItemCollection集合,通过该集合的Count属性可以获取设置的列表总数。

【范例7】

在范例6的基础上进行更改,通过指定DataSource属性实现Repeater控件的绑定。步骤如下。

(1)删除页面中与SqlDataSource控件有关的代码。

(2)删除页面中Repeater控件的DataSourceID属性。

(3)在页面后台的Load事件中添加代码,调用SqlHelper类的GetDataSet()方法获取数据库表UserInfo中的全部记录,然后指定Repeater控件的DataSource属性。代码如下。

    protected void Page_Load(object sender, EventArgs e) {
        string sql = "SELECT UserName, UserPass, UserMail, UserBirth FROM User Info";
        DataSet ds = SqlHelper.GetDataSet(SqlHelper.connString, CommandType.Text, sql, null);
        Repeater1.DataSource = ds;      //指定数据源
        Repeater1.DataBind();           //绑定数据源
    }

(4)重新运行页面查看效果,效果图不再显示。

10.3.3 Repeater控件的事件

除了属性外,Repeater控件还提供了一系列的事件,常见的三个事件分别是ItemCreated、ItemCommand和ItemDataBound。其中,在Repeater控件中创建一项时会引发ItemCreated事件。

1.ItemCommand事件

当单击Repeater控件中的按钮时会引发ItemCommand事件。该事件允许开发者在项模板中嵌入Button、LinkButton和ImageButton控件。

为Repeater控件指定ItemCommand事件时需要传入两个参数。代码如下。

    protected void Repeater1_ItemCommand(object source, RepeaterCommandEvent
    Args e) {

    }

其中,利用RepeaterCommandEventArgs对象的CommandName和CommandArgument可以实现多个操作。CommandName表示执行命令的名称;CommandArgument表示执行命令的参数。CommandName常用的操作命令如表10-5所示。

表10-5 CommandName的常用操作命令

【范例8】

为了方便测试,更改范例7中读取的内容,读取UserInfo表中所有字段的值,并将UserID字段的值显示到页面。然后为项模板添加一个LinkButton控件,指定该控件的CommandName属性和CommandArgument属性。代码如下。

    <asp:LinkButton   ID="lbDelete"   runat="server"   CommandName="Delete"   CommandArgument='<%#Eval("UserID") %>'>测试删除</asp:LinkButton>

为Repeater控件添加ItemCommand事件,后台中的事件代码如下。

    protected  void  Repeater1_ItemCommand(object  source,  RepeaterCommand EventArgs e) {
        string name = e.CommandName;
        int value = Convert.ToInt32(e.CommandArgument);
        LinkButton btn = e.Item.FindControl("lbDelete") as LinkButton;
        Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>
        alert(’删除的主键ID值是:"+value+"')</script>");
    }

在上述代码中,首先通过e.CommandName和e.CommandArgument获取命令名称和命令值,然后获取项模板的LinkButton控件,最后弹出一个对话框提示。

运行页面查看效果,单击图中的【测试删除】按钮,如图10-10所示。

图10-10 ItemCommand事件

2.ItemDataBound事件

在Repeater控件中的某一项被数据绑定后但是尚未呈现在页面之前引发ItemDataBound事件。大多数情况下,可以在ItemDataBound事件中添加自动生成编号的代码。Repeater控件自动生成编号有以下三种方式。

(1)页面中利用Container.ItemIndex属性自动生成编号。直接在项模板中添加该属性,默认值从0开始,如果使编号从1开始,则需要设置为Container.ItemIndex+1。代码如下。

    <ItemTemplate><%#Container.ItemIndex+1 %></ItemTemplate>
    <AlterItemTemplate><%#Container.ItemIndex+1 %></AlterItemTemplate>

如果需要为Repeater控件添加连续编号,执行向下页翻页后序号接前一页的序号时可以用以下代码。

    <%#Container.ItemIndex+1+(this.AspNetPager.CurrentPageIndex-1)*pageSize%>

其中,AspNetPager表示第三方分页控件AspNetPager控件的ID属性值,pageSize是指每页的数据数量。

(2)页面中利用Repeater控件的Items.Count属性。通过该属性可以获取控件的所有总数据记录。代码如下。

    <ItemTemplate><%#this.Repeater1.Items.Count+1 %></ItemTemplate>
    <AlterItemTemplate><%#this.Repeater1.Items.Count+1 %></AlterItemTemplate>

其中,Repeater1表示Repeater控件的ID属性值。

(3)页面后台利用e.Item.ItemIndex属性。

【范例9】

观察图10-10可以发现,在页面中显示主键ID值时,ID的值并不是连续的。这可能是因为开发者已经删除了主键ID值在5~45之间的所有记录。下面为ItemDataBound事件添加代码实现自动编号。步骤如下。

(1)更改Repeater控件中项模板的内容,这里不再显示主键ID,而是使用自动编号来代替。代码如下。

    <asp:Label runat="server" ID="lblNumber" Text="0" />

(2)为Repeater控件指定ItemDataBound事件,在事件代码中首先判断当前项是否为数据项,如果是则获取页面中ID属性值为lblNumber的Label控件,并为该控件的Text属性赋值。代码如下。

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
          Label lb = (Label)e.Item.FindControl("lblNumber");
                                                    // ID为lblID的Label控件
            lb.Text = Convert.ToString(e.Item.ItemIndex + 1);       //指定值
        }
    }

(3)运行页面查看效果,如图10-11所示。

图10-11 ItemDataBound事件

教程类别