在ItemDataBound事件中的另一个控件之前插入一个控件

时间:2011-10-17 15:26:52

标签: asp.net

我尝试Solution suggested here,但在我的情况下它不起作用。使用Page.Controls.IndexOf()对我页面上的任何元素进行调用时,在ItemDataBound事件方法中调用时,返回-1。

我需要根据我的数据转发器生成的内容的某些条件插入换行符。这是方法:

private String lastCharacter = "";
public void users_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
    HyperLink link = (HyperLink)e.Item.FindControl("micrositeLink");

    Tuple<String, String> user = (Tuple<String, String>)e.Item.DataItem;
    link.NavigateUrl = "/" + user.Item1;
    link.Text = user.Item2;

    // makes a break in the data when going from one bunch of data to another.
    if (user.Item1.Length >= 2)
    {
        if (lastCharacter == "")
            lastCharacter = user.Item1[1].ToString().ToLower();
        else if (lastCharacter != user.Item1[1].ToString().ToLower())
        {
            HtmlGenericControl lineBreak = new HtmlGenericControl("br");
            if (Page.Controls.IndexOf(link) >= 0)
                Page.Controls.AddAt(Page.Controls.IndexOf(link), lineBreak);

            lastCharacter = user.Item1[1].ToString().ToLower();
        }
    }
}

绑定数据是我系统中名称以特定字母开头的用户列表。我的目标是通过具有相同第二个字母的数据组之间的换行来进一步细分这些数据。例如:

AaPerson    Aarad    AaStuff
Aathing

AbItem    AbStuff

Acan    Achandle     

对我而言,在第二个字母更改的元素之前插入换行符是显而易见的解决方案,但其他建议也很受欢迎。

1 个答案:

答案 0 :(得分:2)

请尝试使用e.Item.Controls.IndexOf

if (e.Item.Controls.IndexOf(link) >= 0) 
    e.Item.Controls.AddAt(e.Item.Controls.IndexOf(link), lineBreak);