2013-03-10 5 views
1

Я хочу взять контроль этикетки с идентификатором TextLabel в коде позади, но это дает мне следующее исключение Object reference not set to an instance of an object. Исключение находится на этой строке кода в код файла:Не удается найти Метка контроля ретранслятор контроля

Label label = e.Item.FindControl("TextLabel") as Label; 

    string text = label.Text; 

Какую ошибку я здесь сделал? Как найти элемент управления TextLabel в коде?

код ASPX:

<asp:Repeater ID="UserPostRepeater" runat="server" OnItemDataBound="UserPostRepeater_ItemDataBound"> 
    <HeaderTemplate> 
    </HeaderTemplate> 
    <ItemTemplate> 

     <asp:Label ID="TextLabel" runat="server" Text="Label"></asp:Label> 
    </ItemTemplate> 
    <FooterTemplate> 
    </FooterTemplate> 
</asp:Repeater> 

фоновым кодом:

protected void UserPostRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    BlogProfileEntities blogProfile = new BlogProfileEntities(); 
    Label label = e.Item.FindControl("TextLabel") as Label; 
    string text = label.Text; 
} 
+0

Проверьте вывод HTML. Вероятно, вы увидите, что он дает ему ID, например TextLabel_1, потому что вы не можете найти его с помощью этого идентификатора. –

ответ

5

При использовании ItemDataBound вам необходимо проверить тип элемента ретранслятора - e.Item.ItemType.

Он должен быть либо ListItemType.Item, либо ListItemType.AlternatingItem - это шаблоны, в которых существует метка.

protected void UserPostRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    BlogProfileEntities blogProfile = new BlogProfileEntities(); 

    if (e.Item.ItemType == ListItemType.Item || 
     e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     Label label = e.Item.FindControl("TextLabel") as Label; 
     string text = label.Text; 
    } 
} 
+0

Или лучше просто проверить, действительно ли dataitem! = Null –

+1

@TomasVoracek - 'FindControl' стоит дорого. Лучше всего звонить, только если разумно ожидать, что он будет там. – Oded

+0

Зачем создавать новый экземпляр _before_ проверки типа элемента? Кажется, пустая трата ресурсов. –

1

Вы должны проверить в ItemDataBound правильную ItemType, так как он вызывается для каждый пункта, поэтому для Header первых.

protected void UserPostRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    // This event is raised for the header, the footer, separators, and items. 
     // Execute the following logic for Items and Alternating Items 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
     Label label = e.Item.FindControl("TextLabel") as Label; 
     string text = label.Text; 
     } 
} 
1

Вы должны указать, какой тип ItemType это. Это будет работать в вашем случае:

protected void UserPostRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) // Add this 
    { 
    Label label = e.Item.FindControl("TextLabel") as Label; 
    string text = label.Text; 
    } 
} 
+0

Зачем создавать новый экземпляр _before_ проверки типа элемента? –

+0

Вы правы ... я только что отредактировал приведенный выше код для ответа. –

Смежные вопросы