asp:转发器 - 部分更改时的标头

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

非常感谢任何帮助.

Joe*_*orn 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>
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)


ctr*_*3nd 0

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 纳粹分子更高兴。