2011-10-17 5 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 = пользователи; micrositeList.DataBind(); 'Причина, по которой я использую Tuple, а не что-то напечатанное, заключается в том, что типизированные вещи создают проблемы с' HttpRuntime.Cache'. – Oliver

+0

Вы рассматривали использование 'DataBinder.Eval' в событии' ItemDataBound' вместо этого? –

ответ

2

Попробуйте использовать e.Item.Controls.IndexOf вместо:

if (e.Item.Controls.IndexOf(link) >= 0) 
    e.Item.Controls.AddAt(e.Item.Controls.IndexOf(link), lineBreak); 
Смежные вопросы