有没有办法在数据绑定asp:repeater控件中的字段更改中显示子标题行,例如
而不是
country | colour | number uk | red | 3 uk | green | 3 france | red 3
这样做:
==UK== colour | number red | 3 green 3 ==FRANCE== colour | number red | 3
非常感谢您的帮助。
答案 0 :(得分:5)
没有内置支持,但这并不意味着它是不可能的。
你需要覆盖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>
然后在代码隐藏中:
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;
}
}
答案 1 :(得分:2)
另一种解决方案是简单地使用两个中继器,一个嵌套在另一个中。您可以将包含子记录的组传递给第一个转发器,并在组转发器的ItemDataBound上将子记录传递给子转发器并在那里调用DataBind()。
这是更多代码,但实际上可以让您更好地控制布局,而无需在代码隐藏中使用HTML创建代码。
正如您在此处所见,我们有一个父转发器,在项目模板中,我们可以根据需要自定义每个组。在ChildRepeater中,我们有项目模板,我们可以在其中自定义分组中的每个项目。非常干净,并且都具有声明性UI。
<asp:Repeater runat="server" id="GroupRepeater">
<ItemTemplate>
<asp:Literal runat="server" id="HeaderText" />
<asp:Repeater runat="server id="ChildRepeater">
<ItemTemplate>
<asp:Literal runat="server" id="InfoGoesHere" />
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
在后面的代码中我们可以有类似的东西:
private void GroupRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//Get the child records, this can be any data structure you want
SomeChildCollection children = ((SomeGroupCollection)e.Item.DataItem).Children;
//Find the child repeater
Repeater childRepeater = e.Item.FindControl("ChildRepeater") as Repeater;
childRepeater.ItemDataBound += SomeMethod;
childRepeater.DataSource = children;
childRepeater.DataBind();
}
绑定每个子节点后,您可以订阅ItemDataBound事件,并根据需要对绑定进行子绑定。
答案 2 :(得分:0)
啊 - 你是在分组转发器之后。我过去改编的solution似乎已经消失了。也许你可以找到它。但无论如何,搜索分组中继器应该会有所帮助。
答案 3 :(得分:0)
要加入解决方案,我可以建议以下 - 改变这一行:
header.Text = string.Format("<strong> {0} </strong><br/><table>", CurCountry);
到
header.Text = string.Format(header.Text, CurCountry);
而且你可以自定义外观&amp;感觉来自.as?x文件。
答案 4 :(得分:0)
dotnetjunkies代码中似乎有一些错误,但我在这里找到了一个更简单的解决方案http://www.west-wind.com/weblog/posts/140753.aspx
现在转发器不支持分组,所以你必须自己做,但这很容易做到。在上面的转发器中,以下数据表达式负责分组:
<%# this.RenderGroup(Eval("Group") as
string) %>
表达式调用表单上的方法以呈现额外的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>";
}
为每个项目调用此代码,它只是检查该组是否已更改。如果没有返回任何内容,则返回一个简单的div标签作为字符串嵌入到标记中。我选择发回HTML但我想你也可以返回true或false并有条件地在Repeater中渲染一个控件,这会让CSS Nazis更快乐。