Доступ к столбцам в событии ItemDataBound, когда источником данных является Linq

Im, устанавливая источник данных с помощью следующего кода:

    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();
    }

Теперь я хочу знать, как я могу получить доступ к 1 столбцам (например, CustomerID) из события ItemDataBound.

    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;
    }

Я выяснил, что e.Item.DataItem содержит все поля из моего запроса, а тип e.Item.DataItem -

f__AnonymousType8<string,bool,byte,string,string,string,long>

Ответы

Ответ 1

Вы не привязываете datarow к своему управлению (вы привязываете анонимный тип), поэтому вам не следует бросать DataItem в DataRow.

Попробуйте получить данные своей строки как:

var dataItem = e.Item.DataItem;
// For example get your CustomerID as you defined at your anonymous type :
string customerId = dataItem.CustomerID;

Ответ 2

Наконец, нашел это, было так просто, как следующее:

long customerID = long.Parse(DataBinder.Eval(e.Item.DataItem, "CustomerID").ToString());

Ответ 3

Этот подход .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;
    }
}

Все кредитные: http://www.kristofclaes.be/blog/2010/08/12/anonymous-types-and-the-itemdatabound-event/

Поскольку страница теперь показывает ошибку 404, вот страница с Wayback Machine: Анонимные типы и событие ItemDataBound (архивная версия)