对于呈现数据库信息的页面表格,我们可以通过repeat、gridview、datalist这三者控件,三者各有优缺点:
repeat控件:呈现速度最快、效率最高、功能最简单。
gridview控件:呈现速度最慢、效率最低、功能最复杂。
datalist控件:介于以上二者之间。
那么,我们到底该如何选择呢?
这其实是要根据实际需要而定的。如果数据库中数据量比较少,那就用gridview。如果数据量比较大,那就用repeat,如果你想实现表格中的一些特别样式(镶嵌控件)而且比较灵活,那就用datalist。
不过,对于本人而言,我喜欢repeat控件,因为我重视简洁、效率。对于datalist控件,我没有怎么用过,所以对其不是很了解,但仍让我比较满意。也就是说我几乎不喜欢用gridview,因为弊端太明显了。在我学习的过程中,大部分老师也是建议能不用gridview就不用(虽然功能强大,实现比较简单)。
对于gridview,它的强大在于能简单实现分页、排序、丰富的格式样式以及易于操作的布局。
对于repeat,以上gridview的大部分功能其实都能实现,只不过实现起来相当复杂些,但我们只要掌握它,那么gridview面对repeat而言,就会变得毫无优势。
那么我今天就来介绍一下如果利用repeat控件实现排序功能。
首先在页面上将repeater控件的行标题添加linkbutton控件,并在repeater控件上添加两个事件方法
页面代码:
(注意:以下页面信息是本人工程项目中的代码,请自行根据情况更改)
<table>
<asp:RepeaterID="Repeater1" runat="server"OnItemCommand="Repeater1_ItemCommand"
OnItemDataBound="Repeater1_ItemDataBound">
<HeaderTemplate>
<tr>
<th>
<asp:LinkButtonID="specialtyName" runat="server"CommandName="specialtyName">专业</asp:LinkButton>
</th>
<th>
<asp:LinkButtonID="classId" runat="server"CommandName="classId">班号</asp:LinkButton>
</th>
<th>
<asp:LinkButtonID="className" runat="server"CommandName="className">班级名称</asp:LinkButton>
</th>
<th>
<asp:LinkButtonID="grade" runat="server"CommandName="grade">年级</asp:LinkButton>
</th>
<th>
<asp:LinkButtonID="classNo" runat="server"CommandName="classNo">班级人数</asp:LinkButton>
</th>
<th>
<asp:LinkButtonID="length" runat="server"CommandName="length">学制</asp:LinkButton>
</th>
<th>
<asp:LinkButtonID="assistantId" runat="server"CommandName="assistantId">辅导员号</asp:LinkButton>
</th>
<th>
<asp:LinkButtonID="explain" runat="server"CommandName="explain">备注</asp:LinkButton>
</th>
<th>
<asp:LinkButtonID="action" runat="server"CommandName="action">操作</asp:LinkButton>
</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#eval_r("specialtyName")%>
</td>
<td>
<%#eval_r("classId")%>
</td>
<td>
<%#eval_r("className") %>
</td>
<td>
<%#eval_r("grade") %>
</td>
<td>
<%#eval_r("classNo")%>
</td>
<td>
<%#eval_r("length") %>
</td>
<td>
<%#eval_r("assistantId")%>
</td>
<td>
<%#eval_r("explain")%>
</td>
<td>
<ahref="#">删除</a>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
后台代码:
protectedvoid Page_Load(object sender, EventArgs e)
{
//这里是将数据库的数据绑定到repeater控件上,由于代码因工程而异,所以就不写了
//绑定返回类型为DataTable dt
GetData=dt.DefaultView;
}
protectedvoid Repeater1_ItemDataBound(object sender, RepeaterItemEventArgse)
{
if (e.Item.ItemType == ListItemType.Header)
{
if (ViewState["id"] != null)
{
LinkButton lkbtnSort =(LinkButton)e.Item.FindControl(ViewState["id"].ToString().Trim());
lkbtnSort.Text = ViewState["text"].ToString();
}
}
}
protectedvoid Repeater1_ItemCommand(object source, RepeaterCommandEventArgse)
{
if (e.Item.ItemType == ListItemType.Header)
{
LinkButton lkbtnSort =(LinkButton)e.Item.FindControl(e.CommandName.Trim());
if (ViewState[e.CommandName.Trim()] == null)
{
ViewState[e.CommandName.Trim()] = "ASC";
lkbtnSort.Text = lkbtnSort.Text + "▲";
}
else
{
if (ViewState[e.CommandName.Trim()].ToString().Trim() =="ASC")
{
ViewState[e.CommandName.Trim()] = "DESC";
if (lkbtnSort.Text.IndexOf("▲") != -1)
lkbtnSort.Text = lkbtnSort.Text.Replace("▲", "▼");
else
lkbtnSort.Text = lkbtnSort.Text + "▼";
}
else
{
ViewState[e.CommandName.Trim()] = "ASC";
if (lkbtnSort.Text.IndexOf("▼") != -1)
lkbtnSort.Text = lkbtnSort.Text.Trim().Replace("▼", "▲");
else
lkbtnSort.Text = lkbtnSort.Text + "▲";
}
}
ViewState["text"] = lkbtnSort.Text;
ViewState["id"] = e.CommandName.Trim();
DataView dv = GetData;
dv.Sort = e.CommandName.ToString().Trim() + " " +ViewState[e.CommandName.Trim()].ToString().Trim();
Repeater1.DataSource = dv;
Repeater1.DataBind();
}
}
privateDataView GetData
{
get
{
return Cache["_data"] as DataView;
}
set
{
Cache["_data"] = value;
}
}
好了,大功告成,赶紧看看效果吧!