ctr*_*3nd 4 asp.net data-binding formatting repeater
是否有任何方法可以在数据绑定asp:转发器控件中的字段更改中显示子标题行
代替
country | colour | number uk | red | 3 uk | green | 3 france | red 3
做这个:
==UK== colour | number red | 3 green 3 ==FRANCE== colour | number red | 3
非常感谢任何帮助.
没有内置支持,但这并不意味着它是不可能的.
你需要覆盖OnItemDataBound事件,并在标记中有类似的东西:
<asp:Repeater OnItemDataBound="NextItem" ... >
<ItemTemplate><asp:Literal Id="Header" Visible="False" Text="{0}<strong>{1}</strong><br/><table>" ... />
<tr>
<td><asp:Label id="Color" Text="<%# Eval("Color")" ... /></td>
<td><asp:Label id="Number" Text="<%# Eval("Number")" ... /></td>
</tr>
</ItemTemplate>
</asp:Repeater></table>
Run Code Online (Sandbox Code Playgroud)
然后在代码隐藏中:
private string CurCountry = string.Empty;
private void NextItem(object sender, RepeaterItemEventARgs e)
{
if ( e.Item.ItemType != ListItemType.Item
&& e.Item.ItemType != ListItemType.AlternatingItem) return;
DbDataRecord row = (DbDataRecord)e.Item.DataItem;
if (CurCountry != row["country"].ToString() )
{
string prev = (CurCounter == string.Empty)?"":"</table>";
CurCountry = row["country"].ToString();
Literal header = (Literal)e.Item.FindControl("Header");
Literal footer = (Literal)e.Item.FindControl("Footer");
header.Text = string.Format(header.Text, prev, CurCountry);
header.Visible = true;
}
}
Run Code Online (Sandbox Code Playgroud)
dotnetjunkies 代码中似乎有一些错误,但我在这里找到了一个更简单的解决方案http://www.west-wind.com/weblog/posts/140753.aspx
现在中继器不支持分组,因此您必须自己执行此操作,但这很容易做到。在上面的转发器中,以下数据表达式负责分组:
<%# this.RenderGroup(Eval("Group") as
string) %>
Run Code Online (Sandbox Code Playgroud)
该表达式调用表单上的方法来呈现额外的 div 标签。这个简单方法的代码如下所示:
string LastGroup = "@#@~";
protected string RenderGroup(string Group) {
if (Group == this.LastGroup)
return ""; // *** Group has changed
this.LastGroup = Group;
return "<div class='groupheader'>" +Group + "</div>";
}
Run Code Online (Sandbox Code Playgroud)
每个项目都会调用此代码,它只是检查组是否已更改。如果没有返回任何内容,否则将返回一个简单的 div 标签作为嵌入到标记中的字符串。我选择发回 HTML,但我想您也可以返回 true 或 false,并有条件地在 Repeater 中渲染一个控件,这会让 CSS 纳粹分子更高兴。
归档时间: |
|
查看次数: |
5881 次 |
最近记录: |