【问题标题】:Split datalist into sections将数据列表拆分为多个部分
【发布时间】:2011-05-31 04:57:37
【问题描述】:
在我的数据列表中,当不同的年份发生时,我想创建一个分隔符,将每个 ItemTemplate 与新的一年分开。
我使用以下方法选择我的数据:
MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM code_post", dbcon);
在该字段中,date 表示它的创建年份。例如 2011、2010、2009。
当发生不同的年份时,如何为新的年份部门设置标题?
【问题讨论】:
标签:
c#
.net
asp.net
datalist
【解决方案1】:
截至目前,数据处于扁平层次结构中,例如 List<DataObject>。您可以使用 Linq 或 for-loops 在Dictionary<int,List<DataObject>> 中创建它,其中字典键中的每个条目将是年份值,而值将是该年份的数据对象列表。比您的转发器内部应该有一个转发器,然后将此 Dictionary 对象绑定到外部转发器,内部转发器数据源应该是 DataItem.Value (即绑定到外部转发器数据项的当前 KeyValue 对的值部分)。
这不是你可以直接复制/粘贴的答案,但我希望你明白了
【解决方案2】:
我也遇到过这种情况。
我所做的是……
我拿了一个中继器并从数据库中获取了DISTINCT 年。
使用HiddenField 并像这样将年份与DataList 一起保存在<ItemTemplate> 中。
<asp:HiddenField ID="hfYear" runat="server" Value='<%#Eval("year")%>' />
然后使用中继器的ItemDataBound,我首先搜索DataList 和HiddenField,然后通过从HiddenField 传递年份,将DataList 与另一种方法绑定。
OnitemDataBound 使用
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
HiddenField hf = (HiddenField)e.Item.FindControl("hfYear");
DataList dl = (DataList)e.Item.FindControl("yourDataListID");
yourDataListBindMethod(hf.Value);
}
唯一的缺点是需要多次往返数据库(不同年份的数量=访问数据库的次数)。
【解决方案3】:
我解决这个问题的方法是通过一次访问数据库,并拥有诸如
之类的代码
private String previousYear;
public string outputHeader(object y){
String year = y.ToString();
if(!previousYear.equals(year)){
previousYear = year;
return year;
}
return "";
}
在我所做的项目模板中
<%# outputHeader(Eval("date")) %>
这允许一次访问数据库,并且比以前建议的方法更有效/更灵活