Я использую System.Windows.Forms.DataGrid. Он заполнен примерно 3000 строками и очень медленно перерисовывается. Если я минимизирую и максимизирую свою форму, все остальные элементы управления просто отображаются, но в конечном итоге я наблюдаю, как перерисовка DataGrid строка за строкой. Все в этом DataGrid доступно только для чтения, если это имеет значение.
Обновление:
Я не совсем уверен, как правильно реализовать событие CellValueNeeded () для моего проекта, и поможет ли это повысить производительность DataGrid в моем случае.
Я создаю пользовательский элемент управления, содержащий DataGridView (см. Код ниже). Когда вызывается метод SetProject (), мой элемент управления устанавливается на конкретный экземпляр моего класса Project. Затем элемент управления использует статический метод Informa.Data.GetProjectDataTable (Project proj) для извлечения DataTable из проекта. Затем для свойства DataSource объекта DataGrid устанавливается значение возвращаемого DataTable.
Я впервые сделал что-нибудь с ADO или DataGrids, так что терпите меня. Похоже, CellValueNeed () позволяет мне переопределить то, как DataGrid находит значение для одной из своих ячеек, но в моем случае это намного сложнее, чем примеры в MSDN. Фактический источник моих данных - это древовидная структура различных объектов Node, корнем которой является экземпляр проекта. Каждый узел может иметь переменный набор свойств, который также может быть расширен пользователем во время выполнения. Затем существует множество других сложностей с узлами, наследующими значения свойств от своих родительских узлов и суммирующими другие свойства от своих дочерних узлов.
Informa.Data.GetProjectDataTable () преодолевает все это безумие и генерирует единую плоскую DataTable со всеми свойствами всех узлов. На данный момент меня не волнует возможность связать любое изменение этой таблицы с исходной древовидной структурой или обновлять определенные части таблицы при изменении древовидной структуры. Все, что я хочу сделать, это отобразить данные пользователю в DataGrid.
Итак, могу ли я реализовать CellValueNeeded () для чтения из DataTable, предоставленного проектом? Я бы подумал, что DataGrid уже знает, как эффективно использовать DataTable в качестве DataSource?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Informa;
namespace Informa
{
public partial class ProjectGridControl : UserControl
{
private Project proj;
public ProjectGridControl()
{
InitializeComponent();
}
public void SetProject(Project proj)
{
this.proj = proj;
UpdateGridControl();
}
public void UpdateGridControl()
{
if (this.proj == null)
{
this.dataGrid.DataSource = null;
}
else
{
//Extracts a DataTable from the project and sets it as the
//DataSource of the property grid
this.dataGrid.DataSource = Informa.Data.GetProjectDataTable(proj);
}
}
}
}