Ultragrid: как лучше всего добавить набор подстрок программно?
У меня есть Ultragrid Ultragrid, который используется для отображения списка атрибутов. Иногда атрибут является массивом, поэтому я добавляю подстроку для каждого элемента, чтобы пользователь мог при желании развернуть строку, показывающую атрибут массива, и просмотреть все значения элемента.
Поэтому для каждого элемента я использую:
var addedRow = mGrid.DisplayLayout.Bands[1].AddNew();
который, если у меня 300 элементов, вызывается 300 раз и занимает около 9 секунд (я профилировал приложение, и этот вызов занимает 98% прошедшего времени)
Есть ли способ добавить эти подстроки более эффективно?
2 ответа
Я знаю, что опоздал с ответом, но, надеюсь, кто-нибудь сможет использовать мой ответ в любом случае. Всякий раз, когда мне нужно установить строки и подстроки для ultragrid, я просто устанавливаю источник данных, используя linq и анонимные типы для генерации коллекции propper. Допустим, у вас есть список лиц (id, Name) и список автомобилей (id, CarName и OwnerId (personId)), теперь вы хотите показать в виде таблицы всех людей с подразделением раскрывающейся метки, указывающим, какие машины принадлежат им. просто сделайте следующее.
List<Person> persons = GetAllPersons();
List<Car> cars = GetAllCars();
grid.DataSource = persons.Select(x => new {x.Id, x.Name, Cars = cars.Where(z => z.OwnerId == x.Id).ToList()}).ToList();
Обратите внимание на анонимный тип, который я создаю, он сгенерирует список объектов, имеющих идентификатор, имя и коллекцию автомобилей. Также обратите внимание, что я вызываю метод ToList дважды в последней строке, это необходимо для правильной привязки ultragrid.
Также обратите внимание, что если вам нужно отредактировать вид сетки, то вышеописанного метода migth будет недостаточно, поскольку для ультрасетки необходим модифицирующий источник данных, и я не верю, что это сработает. НО в интернете вы найдете несколько расширений, которые могут скопировать коллекцию Linq в DataTable, и тогда вы также сможете редактировать сетку.
Я часто использовал вышеупомянутый метод, и он работает очень хорошо, даже для огромных коллекций.
Надеюсь, это кому-нибудь поможет
Вы можете использовать ultraGrid1.BeginUpdate();
а также ultraGrid1.EndUpdate(true);
остановить экран от перекраски. сделал огромный выигрыш в производительности для моего приложения.
Также в моем случае я заполнил почти>10000 строк, поэтому использовал UltraDataSource