2013-03-10 82 views
1

我想利用在後面的代碼ID TextLabel Label控件,但是這給我下面的異常Object reference not set to an instance of an object.唯一的例外是在這行代碼中的代碼隱藏文件:找不到標籤控制在Repeater控件

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輸出。您可能會看到它爲其提供了一個類似TextLabel_1的ID,這是您無法使用該ID找到它的原因。 – 2013-03-10 13:37:49

回答

5

當使用ItemDataBound你需要檢查中繼器項目的類型 - e.Item.ItemType

它需要是ListItemType.ItemListItemType.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

或更好地檢查數據項!= null – 2013-03-10 13:40:20

+1

@TomasVoracek - 'FindControl'非常昂貴。只有當期望它在那裏是合理的時候纔打電話更好。 – Oded 2013-03-10 13:41:26

+0

爲什麼創建一個新的實例_before_檢查項目類型?似乎浪費資源。 – 2013-03-10 15:56:18

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_創建新實例? – 2013-03-10 15:55:16

+0

你是對的...我剛剛編輯了上述代碼的答案。 – 2013-03-10 18:47:56