2009-02-03 80 views
4

是否有任何方式来调出一个数据绑定中的字段中的变化的子标题行asp:repeater控件例如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

似乎有是在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纳粹更快乐。

0

啊 - 你是在一个分组中继器之后。我过去改编的solution似乎已经消失了。也许你可以找到它。但无论如何,搜索分组中继器应该有所帮助。

+0

干杯,这就是我要找的。 – ctrlalt3nd 2009-02-03 14:28:01

+0

该文章不再有效。 – NotMe 2010-02-09 17:59:38

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; 
    } 
} 
+0

谢谢!这对我有效。 – Eden 2011-11-28 18:59:05

0

乔尔的解决方案,我可以指点下 - 改变这一行:

header.Text = string.Format("<strong> {0} </strong><br/><table>", CurCountry); 

header.Text = string.Format(header.Text, CurCountry); 

而且你可以自定义外观&感受.as?x文件。

1

另一种解决方案是简单地使用两个中继器,一个嵌套在另一个中。您可以将带有子记录的组传递给第一个转发器,并在组转发器的ItemDataBound上将子记录传递给子转发器,并在那里调用DataBind()。

这是更多的代码,但实际上可以让您更好地控制布局,而无需在您的代码隐藏中创建HTML代码。

正如您在此处看到的,我们有一个父级重复器,并且在项目模板中,我们可以根据需要自定义每个组。在ChildRepeater中,我们有我们的项目模板,我们可以在该模板中自定义分组内的每个项目。非常干净,所有的声明性用户界面。

<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事件后,做孩子,你认为合适的结合来控制。