ItemDataBound和ObjectDataSource

时间:2016-03-25 21:56:14

标签: c# asp.net entity-framework

我想为嵌套的Repeater设置ItemDataBound事件。

我为ItemDataBound EventHandler编写了这段代码。

 if (e.Item.ItemType == ListItemType.AlternatingItem ||
    e.Item.ItemType == ListItemType.Item)
{
 Tour dataitem = (Tour)(e.Item.DataItem);
 ObjectDataSource ObjectDataSource1 = (ObjectDataSource)e.Item.FindControl("ObjectDataSource1");

 ObjectDataSource1.SelectParameters["Id"].DefaultValue =  dataitem.TourId.ToString();
}

似乎这条线正常工作

Tour dataitem = (Tour)(e.Item.DataItem);

我的问题从这里开始: 我有这个例外

Object reference not set to an instance of an object.

换行

ObjectDataSource1.SelectParameters["Id"].DefaultValue =  dataitem.TourId.ToString();

但问题出在这一行

        ObjectDataSource ObjectDataSource1 = (ObjectDataSource)e.Item.FindControl("ObjectDataSource1");

我需要知道为什么需要这一行。

如果我省略了这个,它可以正常工作,但没有错误。 因为它知道我的objectdatasource控件为什么需要它?

我需要对此行以及如何修复异常进行一些解释。我还没用过try catch。

我按照这篇文章编写代码:

https://msdn.microsoft.com/en-us/library/bb510144.aspx

2 个答案:

答案 0 :(得分:1)

Tour dataitem = (Tour)(e.Item.DataItem);

以上一行应为

Tour dataitem = (Tour)(((System.Data.DataRowView)e.Item.DataItem)).Row;

您还需要检查dataitem是否为空

if(dataitem != null)
    ObjectDataSource1.SelectParameters["Id"].DefaultValue =  dataitem.TourId.ToString();

您需要此行来获取对绑定到转发器的前端代码中使用的objectdatasource的引用,以便您可以设置Tour对象的TourId。

ObjectDataSource ObjectDataSource1 = (ObjectDataSource)e.Item.FindControl("ObjectDataSource1");

答案 1 :(得分:1)

为了从嵌套的Repeater的ItemDataBound事件访问“ObjectDataSource1”,ObjectDataSource需要嵌套在此Repeater中。

原因Object reference not set to an instance of an object.是因为在调用(ObjectDataSource)e.Item.FindControl("ObjectDataSource1")时未在此Repeater中找到“ObjectDataSource1”