2011-10-17 53 views
0

我尝试了Solution suggested here,但它在我的情况下不起作用。使用Page.Controls.IndexOf()作为页面上的任何元素,当在事件方法ItemDataBound中调用时,返回-1。在ItemDataBound事件中的另一个控件之前插入一个控件

我需要根据特定的条件为我的数据中继器生成的东西插入换行符。下面是方法:

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  

对我来说,将在第二个字母的变化是显而易见的解决方案中的元素之前断行,但其他的建议也很受青睐。

+0

你为什么铸造'e.Item.DataItem'键入'Tuple'? –

+0

这是底层dataItem:'List > users = getUsers(Request.QueryString [“letter”]); micrositeList.DataSource = users; micrositeList.DataBind();'我使用一个Tuple而不是某种类型的原因是Typed的东西使'HttpRuntime.Cache'出现问题。 – Oliver

+0

您是否考虑过在'ItemDataBound'事件中使用'DataBinder.Eval'? –

回答

2

尝试使用e.Item.Controls.IndexOf代替:

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