GridView DataKeyNames вложенных коллекций или пользовательских объектов - PullRequest
0 голосов
/ 11 августа 2011

Я использую пользовательские объекты для привязки к GridView.

Предположим, у меня есть коллекция автомобильных компаний (Audi, Ford, BMW и т. Д.). Каждый объект компании имеет такие свойства, как идентификатор, имя, страна и т. Д.

У каждой компании также есть коллекция автомобилей. Каждый автомобиль имеет такие свойства, как идентификатор, модель, год и т. Д.

Я хочу связать эту информацию с GridView.

Итак, я получаю запрос о компаниях, и в первом объекте каждой коллекции автомобилей есть данные об одном автомобиле (объектная модель такая же, потому что в других сценариях мне нужно перечислить все автомобили компании).

Нет проблем, когда я связываю Gridview с коллекцией Companies. Я могу перечислить информацию о каждой компании и каждой машине, которую я хочу показать.

Проблема возникает, когда я хочу установить DataKeyNames. Я хочу установить его с помощью идентификатора каждого автомобиля (а не идентификатора каждой компании) для сравнения автомобилей.

Я пытался что-то вроде этого:

GridViewCompanies.DataSource = companies;
GridViewCompanies.DataKeyNames = new string[] { "Cars[0].Id" };

Но это не работает, оно говорит, что не содержит свойства с именем.

Есть ли способ установить его?

Я не хочу вместо этого связывать Gridview с коллекцией Cars, потому что если я сделаю это таким образом, я упущу информацию о каждой компании и мне тоже придется использовать ее свойства.

Большое спасибо.

1 Ответ

1 голос
/ 11 августа 2011

Попробуйте:

var carCompanyList = new[]
                    {
                      new { Id = 1, Name = "Audi", Cars = new[] { new { Id = 10, Model = "Audi_Model_1" }, new { Id = 12, Model = "Audi_Model_2" } } }, 
                      new { Id = 2, Name = "Ford", Cars = new[] { new { Id = 20, Model = "Ford_Model_1" }, new { Id = 22, Model = "Ford_Model_2" } } }
                    };

var gridViewData = from carCompany in carCompanyList
                    select new
                            {
                              carCompany.Id,
                              carCompany.Name,
                              firstModelId = carCompany.Cars == null || carCompany.Cars.Count() == 0 ? 0 : carCompany.Cars.First().Id
                            };

CarModelGridView.DataSource = gridViewData;
CarModelGridView.DataKeyNames = new [] { "firstModelId" };
CarModelGridView.DataBind();
...