2011-09-08 46 views
0

我有一个错误:ListView控件的FindControl错误

System.NullReferenceException – Object reference not set to an instance of an object.

为了下一个代码:

<asp:ListView ID="LV1" runat="server" DataSourceID="LinqDataSource"> 
    <ItemTemplate> 
    <asp:Image ID="Image1" Width="100px" Height="100px" runat="server" ImageUrl='<%# Eval("ImageUrl") %>' /> 
    //....and so on till the 
</asp:ListView> 

代码 - 背后:

protected void checkTheImage() 
{ 
    ((Image)LV1.FindControl("Image1")).ImageUrl = "(noImage.jpg)" ; 
} 

,并在Page_Load中的代码:

protected void Page_Load(object sender, EventArgs e) 
{ 
    checkTheImage(); 
} 

为什么我得到错误?我的代码有什么问题?

+2

我的猜测是,当您调用checkTheImage()时(即太早),ListView数据绑定实际上并未发生。您可以通过使用稍后在Page生命周期中发生的事件(如Page_PreRender)来快速测试此事件。编辑:第二个想法,这可能还为时过早,而是尝试处理ListView.Databound事件,并尝试在那里你的代码。 –

+0

我同意丹尼尔B.你应该阅读[this](http://msdn.microsoft.com/en-us/library/ms178472.aspx#data_binding_events_for_databound_controls) – luviktor

+0

当我写Page_PreRender时,问题解决了。太好了!谢谢 – Oshrib

回答

2

您必须指定项目:

protected void checkTheImage() 
{ 
    ((Image)LV1.Items[0].FindControl("Image1")).ImageUrl = "(noImage.jpg)" ; 
} 

因为ListView控件呈现给每个孩子项目image1的控制。要更改所有图像:

protected void checkTheImage() 
{ 
    foreach(ListViewItem item in LV1.Items) 
     ((Image)item.FindControl("Image1")).ImageUrl = "(noImage.jpg)" ; 
} 
+0

谢谢。现在我没有得到错误...但它不显示noImage.jpg ...为什么? – Oshrib

+0

当我编写Page_PreRender时,问题就解决了。太好了!谢谢 – Oshrib