当数据源为Linq时,访问ItemDataBound事件中的列

Fab*_*ian 16 c# linq asp.net

我使用以下代码设置数据源:

    protected void Page_Load(object sender, EventArgs e)
    {
        var vacancies = from v in db.Vacancies
                    join c in db.Customers on v.CustomerID equals c.CustomerID
                    join cp in db.CustomerPortals on c.CustomerID equals cp.CustomerID
                    where cp.PortalID == Master.Portal.ID
                    select new
                    {
                        Title = v.Title,
                        Internship = (v.ContractID == 6),
                        Hours = v.Hours,
                        City = v.Customer.City.Name,
                        Degree = v.Degree.Title,
                        Contract = v.Contract.Title,
                        CustomerID = v.CustomerID
                    };
        rVacancies.ItemDataBound += new RepeaterItemEventHandler(rVacancies_ItemDataBound);
        rVacancies.DataSource = vacancies;
        rVacancies.DataBind();
    }
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何从ItemDataBound事件访问其中一列(如CustomerID).

    void rVacancies_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
         // This doesnt seem to work, row would be null even though e.Item.DataItem has a value.
         DataRow row = (DataRow)e.Item.DataItem;
    }
Run Code Online (Sandbox Code Playgroud)

我已经发现e.Item.DataItem包含了我查询中的所有字段,而e.Item.DataItem的类型是

f__AnonymousType8<string,bool,byte,string,string,string,long>
Run Code Online (Sandbox Code Playgroud)

Fab*_*ian 36

终于找到了它,就像下面这样简单:

long customerID = long.Parse(DataBinder.Eval(e.Item.DataItem, "CustomerID").ToString());
Run Code Online (Sandbox Code Playgroud)


Rob*_*obD 35

这种.Net 4.0方法确实非常酷!

public void PersonDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        dynamic person = e.Item.DataItem as dynamic;

        string name = person.Name;
        int age = person.Age;
    }
}
Run Code Online (Sandbox Code Playgroud)

所有信用:http: //www.kristofclaes.be/blog/2010/08/12/anonymous-types-and-the-itemdatabound-event/

因为页面现在显示错误404,这里是Wayback Machine的页面: 匿名类型和ItemDataBound事件(存档版本)


Can*_*var -2

您没有将数据行绑定到控件(您正在绑定匿名类型),因此您不应将 DataItem 强制转换为 DataRow。

尝试获取行数据:

var dataItem = e.Item.DataItem;
// For example get your CustomerID as you defined at your anonymous type :
string customerId = dataItem.CustomerID;
Run Code Online (Sandbox Code Playgroud)

  • 所以我在这方面迟到了两年,但没有其他人注意到这无法编译?“var”仍然尝试在设计时推断数据类型,并且由于它是匿名类型,因此无法执行此操作。此代码应该会向您显示错误“无法解析第二行上的符号‘CustomerID’。假设 .NET 4.0,RobD 的方法是正确的。 (9认同)